このプログラムが「 klm 」だけでなく「 klmnop 」を出力する理由がわかりません。b はサイズ 2 の配列です! これはコードです:
struct S
{
int i1;
int i2;
char b[2];
};
int main()
{
char a[] = "abcdefghijklmnop";
struct S* s = a + 2;
printf("[%s]\n" , s->b);
return 0;
}
このプログラムが「 klm 」だけでなく「 klmnop 」を出力する理由がわかりません。b はサイズ 2 の配列です! これはコードです:
struct S
{
int i1;
int i2;
char b[2];
};
int main()
{
char a[] = "abcdefghijklmnop";
struct S* s = a + 2;
printf("[%s]\n" , s->b);
return 0;
}
ほとんどの文字列関数と同様に、printfには、文字列が含まれる配列のサイズに関する情報はありません。単一の文字へのポインタしかなく、この文字が一連の文字の最初であるという約束があります。で終了し'\0'
ます。文字列全体を印刷するように求められると、ターミネータが見つかるかクラッシュするか、どちらか早い方まで続行されます。
printf("[%s]\n" , s->b);
アドレスs->bから文字にデータを出力するため'\0'
です。アドレスの後に、s->b
それが見つかるたびに'\0'
データを出力します。
char b[2];
上記のステートメント'\0'
には最後の文字が含まれていないため、文字列ターミネータが見つかるまでアドレスからデータを読み取り続けます'\0'