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;
}
4

2 に答える 2

5

ほとんどの文字列関数と同様に、printfには、文字列が含まれる配列のサイズに関する情報はありません。単一の文字へのポインタしかなく、この文字が一連の文字の最初であるという約束があります。で終了し'\0'ます。文字列全体を印刷するように求められると、ターミネータが見つかるかクラッシュするか、どちらか早い方まで続行されます。

于 2012-07-02T10:10:51.250 に答える
2

printf("[%s]\n" , s->b);アドレスs->bから文字にデータを出力するため'\0'です。アドレスの後に、s->bそれが見つかるたびに'\0'データを出力します。

char b[2]; 

上記のステートメント'\0'には最後の文字が含まれていないため、文字列ターミネータが見つかるまでアドレスからデータを読み取り続けます'\0'

于 2012-07-02T10:10:31.223 に答える