如果我输入此代码,它将编译并运行(我使用GCC)
#include<stdio.h>
int main()
{
char sentence[8]="September";
printf("The size of the array is %d \n",sizeof(sentence));
printf("The array is %s \n",sentence);
}
并给出输出
数组的大小为8
数组是Septembe
这是如何工作的? C需要一个字符串终止符来知道字符串已经结束。数组如何占用8个字节的空间并知道在哪里停止?
答案 0 :(得分:4)
通过将非NUL终止的字符串传递给printf("%s")
,您正在调用未定义的行为。
就其本质而言,结果是不确定的。似乎是“工作”(就像您看到的那样)。
正如其他人所解释的那样,可能发生的情况是,字符串后面恰好有一个零字节,这阻止了printf
继续前进。但是,如果要在该变量周围添加更多的 stuff ,则可能会看到不同的行为:
#include<stdio.h>
int main(void)
{
char sentence[8] = "September"; // NOT NUL TERMINATED!
char stuff[] = "This way is better";
printf("%s\n", sentence); // Will overrun sentence
return 0;
}