数组使用的内存

时间:2016-04-05 16:12:15

标签: c arrays memory

我想知道为什么会这样。我正在创建一个5元素的整数数组 - 意味着每个元素在内存中占用4个字节。为什么当我打印myArray的地址[-1]时,我也得到一个有效的地址?

#include <stdio.h>
#include <stdlib.h>

int main()
{
   int myArray[] = {1, 2, 3, 4, 5};

   printf("0x%p\n0x%p\n0x%p\n", &myArray[-1], &myArray[0], &myArray[1]);

   return 0;
}

输出: 0x0028FEF8 0x0028FEFC 0x0028FF00

2 个答案:

答案 0 :(得分:2)

由于未定义的行为未定义:它可能有效或无效,因此无法保证您获得分段错误。

答案 1 :(得分:2)

地址不是有效;它与程序中的对象不对应。尝试访问该内存位置会导致未定义的行为 - 可能导致运行时错误。或不。

在几乎所有的实现中,你的数组都将在更大的存储区域中实现,所以自然会在该数组的两侧都有内存单元(除非它从地址0开始,几乎在任何实现中都不会你真的会工作)。由于C不对数组访问强制执行任何类型的边界检查,因此当您使用-1下标时,它不会立即引发异常。是的,你得到的是一个合理的地址值,但是试图使用那个内存位置可能会或可能不会导致某种混乱,具体取决于那里存储的内容(例如帧指针) 。语言定义使行为未定义;它没有要求编译器以任何特定方式处理这种情况。编译器可能发出诊断信息,表明您正在做一些愚蠢的事情并停止翻译。 可以编译代码而不会抱怨,在发生运行时错误之前,您不会知道任何错误。它可以在两者之间做任何事情。