【问题标题】:Why are C array elements (seemingly) stored in blocks of 4?为什么 C 数组元素(看似)存储在 4 个块中?
【发布时间】:2021-06-06 06:34:17
【问题描述】:

我只是在学习 C 并开始思考指针。我的理解是,当你声明一个数组时,数组的地址就是该数组中第一个元素的地址。所有其他元素都连续存储在内存中。

当我使用online C compiler at onlinegdb.com 运行此代码时...

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

    for (i = 0; i < 5; i++) {
        printf("num[%d] has the value %d and is stored at address %p\n",
               i, num[i], &num[i]);
    }

    return 0;
}

我观察到以下...

num[0] has the value 0 and is stored at address 0x7ffe9973e600
num[1] has the value 1 and is stored at address 0x7ffe9973e604
num[2] has the value 2 and is stored at address 0x7ffe9973e608
num[3] has the value 3 and is stored at address 0x7ffe9973e60c
num[4] has the value 4 and is stored at address 0x7ffe9973e610

所以据我所知,C 编译器为num[0] 选择了一个内存位置,然后每个后续元素都放置在四个地址之外。我知道每个编译器都可能不同并且具有不同的行为,但如果这是标准的 - 为什么数组元素似乎存储在四个块中?为什么地址模式不是0x7ffe9973e600、...601、...602、...603、...604?每个元素是否占用多个地址?

【问题讨论】:

  • 因为int 有4个字节? (请注意int 有至少 16 位,所以它可能发生在int 有2 个字节或8 个字节的不同平台上)
  • 哦...是的,这是有道理的。谢谢。
  • 任何 C 编程书籍的第一章通常都会解决各种整数类型的数值限制,从而确定它们的大小。
  • int 数组的每个元素都使用了sizeof(int) 可寻址内存位置。 (C 标准将可寻址的内存位置称为“字节”,无论它有多少位。)

标签: arrays c memory memory-address


【解决方案1】:

内存中的地址代表 1 个字节的数据。 num 数组是 int 类型,每个占用 4 个字节。因此,要存储一个元素num[0],我们需要占用 4 个字节的内存,并且由于每个字节需要 1 个内存地址,因此它们之间有 4 个内存地址的间隙。如果它是 char 数组,那么您会看到序列 0x7ffe9973e600、...601、...602、...603、...604 等等。

【讨论】:

  • 伟大、简短和甜蜜的解释。谢谢!这是我第一次直接处理内存并考虑不同数据类型占用多少空间,所以虽然这对其他人来说可能很明显,但你的解释真的很有帮助:)。
  • 继续学习。指针起初令人困惑,但一旦你掌握了它们,它们就很好了。无论如何,如果它回答了您的问题,请接受它
猜你喜欢
  • 2018-07-12
  • 2021-11-18
  • 2017-10-09
  • 1970-01-01
  • 2010-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-04
相关资源
最近更新 更多