gpt4 book ai didi

c - C中数组显式初始化期间的歧义

转载 作者:太空宇宙 更新时间:2023-11-04 06:21:47 25 4
gpt4 key购买 nike

#include<stdio.h>
int main()
{
char a[4] = {'7','4','5'};
for(int i=0; a[i] != '\0'; i++)
printf("%c\n", a[i]);
}

由于编译器自动以 null 终止数组,因此上述代码按预期工作。

但是当我将第 4 行更改为 char a[] = {'7', '4', '5'}; 时,代码仍然有效,但在末尾打印了一些额外的字符字符串。

我的问题是为什么编译器在第二种情况下不以 null 终止数组。

最佳答案

编译器不会自动以 null 终止数组。它所做的只是用零填充您尚未明确初始化的部分。在您的情况下,只有一个元素未初始化,但它可能是任意数量的元素:

char a[14] = {'7', '4', '5'}; // Compiler provides 11 zeros

如果您为包含 N 个元素的数组指定 N 个初始值设定项,则根本没有元素:

char a[3] = {'7', '4', '5'}; // Compiler provides no zeros

当您让编译器从初始值设定项推导出数组的大小时,没有剩余元素要进行零初始化,因为该数组只有三个元素 - '7', '4''5''\0' 没有空格,因为它等同于上面的情况,当编译器不提供任何额外的零时。

这就是为什么如果你想要空终止你需要自己做,就像这样

char a[] = {'7', '4', '5', '\0'};

或者让编译器通过使用字符串文字进行初始化来为您完成,如下所示:

char a[] = "745";

注意:只有当数组中有足够的空间用于终止符时,编译器才会为使用字符串文字初始化的 char 数组提供空终止符。例如,char a[3] = "745" 不会被终止,因为 '\0' 没有空间。

关于c - C中数组显式初始化期间的歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33635789/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com