只是好奇,如果我int array[0];在代码中定义零长度数组,实际上会发生什么?GCC一点也不抱怨。
样例程序
#include <stdio.h>
int main() { int arr[0]; return 0; } 澄清度
我实际上是想弄清楚是否以这种方式初始化了零长度数组,而不是像在Darhazer的注释中指出的那样,对可变长度进行了优化。
这是因为我必须向野外发布一些代码,所以我试图找出是否必须处理SIZE定义为的情况0,这种情况发生在某些静态定义的代码中int array[SIZE];
实际上,我很惊讶GCC没有投诉,这引起了我的疑问。从我收到的答案中,我认为缺少警告的主要原因是支持未使用新的[]语法更新的旧代码。
因为我主要是想知道该错误,所以我将隆丁的答案标记为正确的(纳瓦兹是第一个,但还不够完整),其他人则指出它在尾部填充结构中的实际用途是“正确的”。正是我想要的。 问题来源于stack overflow
数组的大小不能为零。
ISO 9899:2011 6.7.6.2:
如果表达式是一个常量表达式,则其值应大于零。
上面的文本对于纯数组都是正确的(第1段)。对于VLA(可变长度数组),如果表达式的值小于或等于零(第5段),则行为不确定。这是C标准中的规范性文本。不允许编译器以不同的方式实现它。
gcc -std=c99 -pedantic 对非VLA情况发出警告。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。