数组内存分配

时间:2012-03-06 13:16:36

标签: c arrays memory allocation

这是其中一个编码网站的问题......

替换“?”使用整数,以便输出为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。

请有人解释编译器的行为方式以及内存分配的原因(负面索引)。

2 个答案:

答案 0 :(得分:2)

首先,请注意:从不编写任何依赖于此类行为的代码,因为它会因编译器而异。

编辑:由于第一段显然不够清楚:访问数组超出界限是未定义的行为,这意味着编译器可能会生成一个程序来执行编译器选择的任何操作。在这里,我正在解释海报的编译器可能选择做什么,但也可能是结果变成了4个。

您的编译器显然选择按如下方式布置变量(假设第一个变量最终在地址100处):

  • 100:a
  • 104:d
  • 108:c
  • 112:b
  • 116:arr[0]
  • 120:arr[1]
  • ...
  • 140:arr[6]

由于arr从116开始并且其每个元素(int)的大小为4个字节,arr[-4]为116 + 4 *( - 4)= 100,是a所在的位置。

答案 1 :(得分:1)

C不检查数组边界。这意味着你可以使用一个索引,使你正在使用的内存位置不是为数组分配的内存的一部分。

当你这样做时,你正在访问记忆中的其他位置。在此示例中,为int变量bcda

保留以下4个位置

所以,你将从数组中取出并进入变量的空间。

无论如何,它可能取决于编译器/体系结构,但我希望正确的答案是11(数组的大小+4个变量)

相关问题