Tag: arrays

为什么编译器没有警告超出范围的静态数组索引?

最近,我的一位同事通过写出堆栈上的静态数组(他在不增加数组大小的情况下添加了一个元素)而被严重咬了一口。 编译器不应该捕获这种错误吗? 以下代码使用gcc完全编译,即使使用-Wall -Wextra选项,但它显然是错误的: int main(void) { int a[10]; a[13] = 3; // oops, overwrote the return address return 0; } 我很肯定这是不确定的行为,虽然我现在找不到C99标准的摘录。 但是在最简单的情况下,数组的大小称为编译时间并且索引在编译时是已知的,编译器是否应该至少发出警告?

初始化指针时的字符串文字与char数组

灵感来自这个问题 。 我们可以用字符串文字初始化一个char指针: char *p = “ab”; 它完全没问题。 人们可以认为它等同于以下内容: char *p = {‘a’, ‘b’, ‘\0′}; 但显然事实并非如此。 并且不仅因为字符串文字存储在只读内存中,而且看起来即使通过字符串文字具有char数组类型,并且初始化程序{…}具有char数组的类型,两个声明也是由于编译器发出警告,处理方式不同: 警告:标量初始化程序中的多余元素 在第二种情况下。 这种行为的解释是什么? 更新: 此外,在后一种情况下,指针p将具有值0x61 (第一个数组元素’a’ )而不是存储器位置,这样编译器就像警告一样,仅占用初始化器的第一个元素,将其分配给p 。