c和struct中的数组

时间:2012-07-02 10:05:30

标签: c

我不明白为什么这个程序打印“ 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;
}

2 个答案:

答案 0 :(得分:5)

与大多数字符串函数一样,你的printf没有关于包含字符串的数组大小的任何信息。它只有一个指向单个字符的指针,并且你保证这个字符是第一个字符串。由'\0'终止的字符序列。当被要求打印整个字符串时,它会继续运行,直到找到终止符或崩溃为止,以先到者为准。

答案 1 :(得分:2)

因为printf("[%s]\n" , s->b);会将地址s-> b中的数据打印到字符'\0'。在地址s->b之后,只要找到'\0',它就会打印数据。

char b[2]; 

上面的语句在最后一个字符中不包含'\0',因此它将继续从地址读取数据,直到它找到字符串终止符'\0'