これは未定義の動作です。C99標準セクション7.19.6.5からsnprintf関数:
snprintf関数はfprintfと同等ですが、出力がストリームではなく配列(引数sで指定)に書き込まれる点が異なります。nがゼロの場合、何も書き込まれず、sはnullポインターである可能性があります。それ以外の場合、n-1番目を超える出力文字は配列に書き込まれるのではなく破棄され、実際に配列に書き込まれる文字の最後にヌル文字が書き込まれます。オーバーラップするオブジェクト間でコピーが行われる場合、動作は定義されていません。
呼び出しsymbols
で引数として使用するために、のコピーを作成する必要があります。snprintf()
char symbols[16] = "";
char symbols_copy[16];
int index = 0;
while (index++ < 15)
{
memcpy(symbols_copy, symbols, sizeof(symbols));
if (index % 2)
snprintf(symbols, sizeof symbols, "a%s", symbols_copy);
else
snprintf(symbols, sizeof symbols, "b%s", symbols_copy);
printf("%s\n", symbols);
}
デモhttp://ideone.com/GvnW7Dを参照してください。