我不明白为什么这个程序打印“ 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;
}
答案 0 :(得分:5)
与大多数字符串函数一样,你的printf没有关于包含字符串的数组大小的任何信息。它只有一个指向单个字符的指针,并且你保证这个字符是第一个字符串。由'\0'
终止的字符序列。当被要求打印整个字符串时,它会继续运行,直到找到终止符或崩溃为止,以先到者为准。
答案 1 :(得分:2)
因为printf("[%s]\n" , s->b);
会将地址s-> b中的数据打印到字符'\0'
。在地址s->b
之后,只要找到'\0'
,它就会打印数据。
char b[2];
上面的语句在最后一个字符中不包含'\0'
,因此它将继续从地址读取数据,直到它找到字符串终止符'\0'