0

我不明白为什么这个程序打印“ klmnop ”而不仅仅是“ klm ”。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 回答