char arr1 [0];
arr1[50] = 'A';
char arr2 [0] = {1, 1, 1, 1, 1}; //gives compiler warning
为什么以上编译正常?
为什么只有第二个给我一个警告?
答案 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处添加的值。