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