首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C中内存分配的顺序

C中内存分配的顺序
EN

Stack Overflow用户
提问于 2019-09-28 16:05:21
回答 3查看 1.3K关注 0票数 2

我试图了解计算机/OS/编译器(不确定谁拥有内存分配,因此我的noob问题单)如何将内存地址分配给局部变量。

我有一个简单的程序:

代码语言:javascript
复制
#include <stdio.h>

int main(int argc, char** argv) {

    printf("hello, world\n");
    int arr[10];
    int a = 1;
    int b = 2;
    int c;
    for (int i = 0; i < 10; i++) {

        printf("Variable i: %p\n", &i);
        printf("Variable arr[i]: %p\n", &arr[i]);
    }
    printf("Variable a: %p\n", &a);
    printf("Variable b: %p\n", &b);
    printf("Variable c: %p\n", &c);
}

有两件事我不明白。

  1. 为什么变量I得到的内存地址早于变量arr,变量a/b甚至比变量早?当您实际使用变量或为其赋值时,它似乎有些事情要做。
  2. 如何/为什么操作系统(或负责人)对变量c和变量i使用相同的内存地址?显然,我超出了范围,但c是在之前声明的.

下面是程序的输出:

代码语言:javascript
复制
hello, world
Variable i: 0x7ffd60b1696c
Variable arr[i]: 0x7ffd60b16970
Variable i: 0x7ffd60b1696c
Variable arr[i]: 0x7ffd60b16974
Variable i: 0x7ffd60b1696c
Variable arr[i]: 0x7ffd60b16978
Variable i: 0x7ffd60b1696c
Variable arr[i]: 0x7ffd60b1697c
Variable i: 0x7ffd60b1696c
Variable arr[i]: 0x7ffd60b16980
Variable i: 0x7ffd60b1696c
Variable arr[i]: 0x7ffd60b16984
Variable i: 0x7ffd60b1696c
Variable arr[i]: 0x7ffd60b16988
Variable i: 0x7ffd60b1696c
Variable arr[i]: 0x7ffd60b1698c
Variable i: 0x7ffd60b1696c
Variable arr[i]: 0x7ffd60b16990
Variable i: 0x7ffd60b1696c
Variable arr[i]: 0x7ffd60b16994
Variable a: 0x7ffd60b16964
Variable b: 0x7ffd60b16968
Variable c: 0x7ffd60b1696c

我运行的Ubuntu 18,gcc c99 7.4.0编译器。

EN

Stack Overflow用户

发布于 2019-09-28 16:24:00

C没有说明这些东西中的任何一个。整个问题涉及特定平台上某些特定编译器的内部细节。

标准所说的本质上就是不同的对象(变量等)。一定有不同的地址。这些地址是如何分配的,甚至是真正的地址:这些是实现细节。

为什么变量我得到一个较早的内存地址,然后是变量arr

因为这就是编译器决定要做的。它可以选择相反的顺序,或者把它们放在完全不同的存储区域,如果它愿意的话。如果需要的话,编译器可以选择在奇数天倒序。语言根本不指定任何内容,更不用说保证了。

--当您实际使用变量或给它赋值时,它似乎有一些事情要做。

一个好的优化者很可能选择这样做,因为它最小化了本地使用的存储量。但是(如果这听起来很熟悉的话就阻止我)这是一个实现细节。它可以用不同的编译器标志或者任何东西来改变。

票数 0
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58148075

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档