C数组大小声明意味着什么?

时间:2013-09-08 06:42:54

标签: c arrays

char arr1 [0];
arr1[50] = 'A';

char arr2 [0] = {1, 1, 1, 1, 1}; //gives compiler warning

为什么以上编译正常?

为什么只有第二个给我一个警告?

3 个答案:

答案 0 :(得分:1)

第一个正常编译,因为编译器通常不会意识到a[50] = 0正试图在数组分配的内存之外分配一个值。运行时的行为是未定义的:它可能会崩溃,终止程序,格式化硬盘,或者根本不做任何事情。

第二个发出警告,因为右侧的数组初始值设定项与左侧的数组声明不匹配。这就像写int x = "a string"

答案 1 :(得分:1)

两个声明都应该给你一个编译时错误,因为声明一个长度为0的数组是一个“约束违规”,这是任何编译器必须捕获的错误类型,如果它符合C标准。

char arr2 [0] = {1, 1, 1, 1, 1};

有一个额外的约束违规,即初始化程序多于数组中的元素。您的编译器似乎只捕获那个。

与此相反

arr1[50] = 'A';

只是标准未定义的运行时行为,编译器可以做任何令人满意的事情。一个好的编译器也可以很容易地检测出那个。

总之,您或许应该考虑让自己成为更好,更新的编译器。

答案 2 :(得分:0)

“char arr2 [0] = {1,1,1,1,1};”因为你将arr2声明为零元素数组并用5个元素初始化它会给你一个错误。很可能编译器会抱怨/警告你在数组初始化程序中有多余的元素。你可以做“char arr2 [] = {1,1,1,1,1};”和C将隐式计算出存储或者你可以明确指定元素的数量:“char arr2 [5] = {1,1,1,1,1} ;“

另外,“arr1 [50] ='A';”当您将arr1作为大小为零的数组进行显示时,这是一个坏主意:“char arr1 [0];”。只需声明它,以便它可以包含足够的元素来包含您在索引50处添加的值。