【问题标题】:Memory used by arrays [closed]数组使用的内存[关闭]
【发布时间】:2016-07-25 17:01:59
【问题描述】:

我想知道为什么会这样。我正在创建一个 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

【问题讨论】:

  • 我投票结束这个问题,因为“解释 UB”

标签: c arrays memory


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    因为未定义的行为是未定义的:它可能有效,也可能无效,因此不能保证您会遇到分段错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-06
      • 1970-01-01
      • 2013-04-26
      • 2017-06-26
      • 2013-05-01
      相关资源
      最近更新 更多