c - 在 C 中打印字符串和空字符的概念

标签 c arrays string initialization c-strings

在阅读有关打印字符串的内容时,我通过语句 "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/

相关文章:

c - 如何从文件填充链接列表

c - 消息队列 - 动态消息大小 - C

c - 指针到指针的段错误

javascript - js 与数组匹配搜索

string - 使用 ||对于 swift 中 if 语句中的多个字符串

C 使用指针遍历 char 数组

python - 为什么内置的 python 帮助功能不显示所有可能的命令?

javascript - 我不明白我的 for 循环?

JavaScript 字符串替换函数

javascript - Android:在 webview 上使用 javascript 返回字符串