在阅读有关打印字符串的内容时,我通过语句 "printf
逐个写入字符,直到遇到空字符。如果缺少空字符,printf
继续越过字符串的末尾,直到最终在内存中找到一个空字符。 所以我写了一些代码:
案例 1:
char arr[4] = { 'a', 'b', 'c' } ;
if (arr[3]== '\0')
printf ("%s",arr);
输出为 abc
。
这是否意味着编译器已自动将'\0'
存储在arr[3]
。因为按照声明,printf只有遇到'\0'
才会终止。
案例 2:
char arr[3] = { 'a', 'b', 'c' } ;
if (arr[3]== '\0')
printf ("%s",arr);
尽管不存在数组 block arr[3]
,但输出再次为 abc
,那么为什么这不是错误? printf 还打印了 abc
并停止了,这意味着它一定遇到了 '\0'
。那么这是否意味着编译器在 arr[2]
之后创建了一个额外的数组 block 来存储 '\0'
。如果是这样,那么数组大小必须增加到 4 个字节(1 个字节对于每个 char 类型的字符)。但是执行语句 printf ("%d",sizeof (arr));
给我输出 3
,表明数组大小没有增加,表明有没有 arr[3]
。那么条件if (arr[3]== '\0')
是如何变为真的呢?
案例三:
char arr[3] = "abc";
if (arr[3]== '\0')
printf ("%s",arr);
现在它给了我一个错误,说 “数组索引 3 已经结束(包含 3 个元素)”。 那么为什么这与情况 2。这是否意味着声明:
char arr[3] = "abc";
和
char arr[3] = { 'a', 'b', 'c' } ;
不同。
最佳答案
如果数组的大小大于您显式初始化的元素数量,则剩余元素将被零初始化。
所以你可以有例如
char arr[50] = { 'a' };
第一个元素 (arr[0]
) 将被初始化为包含 'a'
,其余 49 个元素将全部为零。
另请注意,当您定义一个包含三个元素的数组(如问题中的后两个示例)然后使用 arr[3]== '\0'
时,您正在索引边界并有 undefined behavior .
此外,不在数组内的内存内容不确定。你不能指望它有任何值(value)。
最后,
char arr[3] = "abc";
和
char arr[3] = { 'a', 'b', 'c' };
其实是一样的,都是创建一个包含三个元素的数组,内容为'a'
, 'b'
and 'c'
.
关于c - 在 C 中打印字符串和空字符的概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54108978/