这是其中一个编码网站的问题......
替换“?”使用整数,以便输出为4.
int main()
{
int arr[7];
int b,c,d,a;
a=4;
printf("%d",arr[?]);
return 0;
}
我试图解决这个问题,发现答案是-4。 现在,如果我再声明一个变量(如int b,c,d,e,代码的第4行中的a),答案就是-5。
请有人解释编译器的行为方式以及内存分配的原因(负面索引)。
答案 0 :(得分:2)
首先,请注意:从不编写任何依赖于此类行为的代码,因为它会因编译器而异。
编辑:由于第一段显然不够清楚:访问数组超出界限是未定义的行为,这意味着编译器可能会生成一个程序来执行编译器选择的任何操作。在这里,我正在解释海报的编译器可能选择做什么,但也可能是结果变成了4个。
您的编译器显然选择按如下方式布置变量(假设第一个变量最终在地址100处):
a
d
c
b
arr[0]
arr[1]
arr[6]
由于arr
从116开始并且其每个元素(int
)的大小为4个字节,arr[-4]
为116 + 4 *( - 4)= 100,是a
所在的位置。
答案 1 :(得分:1)
C不检查数组边界。这意味着你可以使用一个索引,使你正在使用的内存位置不是为数组分配的内存的一部分。
当你这样做时,你正在访问记忆中的其他位置。在此示例中,为int变量b
,c
,d
和a
所以,你将从数组中取出并进入变量的空间。
无论如何,它可能取决于编译器/体系结构,但我希望正确的答案是11
(数组的大小+4个变量)