C字符串初始值设定项不包含终结符?

too*_*php 5 c string variables

我对以下C代码片段感到有些困惑:

printf("Peter string is %d bytes\n", sizeof("Peter")); // Peter string is 6 bytes
Run Code Online (Sandbox Code Playgroud)

这告诉我,当C用双引号编译一个字符串时,它会自动为空终止符添加一个额外的字节.

printf("Hello '%s'\n", "Peter");
Run Code Online (Sandbox Code Playgroud)

printf函数知道何时停止读取字符串"Peter",因为它到达空终止符,所以......

char myString[2][9] = {"123456789", "123456789" };
printf("myString: %s\n", myString[0]);
Run Code Online (Sandbox Code Playgroud)

在这里,printf打印所有18个字符,因为没有空终止符(并且它们不适合不取出9).C不在变量定义中添加空终止符吗?

小智 24

你的字符串是[2] [9].那些[9]是['1','2'等等......'8','9'].因为你只在第一个数组维度中为9个字符提供了空间,并且因为你使用了全部9个字符,所以没有空间放置'\ 0'字符.重新定义你的char数组:

char string[2][10] = {"123456789", "123456789"};
Run Code Online (Sandbox Code Playgroud)

它应该工作.


Sea*_*ght 5

当然可以,你只是没有为'\ 0'字节留下足够的空间.进行中:

char string[2][10] = { "123456789", "123456789" };
Run Code Online (Sandbox Code Playgroud)

将按预期工作(将只打印9个字符).

  • 编译器没有警告 0 字节没有足够的空间是否有原因?如果我尝试添加另一个不适合的“9”,我会收到警告,但它似乎并不关心删除 0 字节? (2认同)