我试图了解计算机/OS/编译器(不确定谁拥有内存分配,因此我的noob问题单)如何将内存地址分配给局部变量。
我有一个简单的程序:
#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);
}有两件事我不明白。
下面是程序的输出:
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编译器。
发布于 2019-09-28 16:24:00
C没有说明这些东西中的任何一个。整个问题涉及特定平台上某些特定编译器的内部细节。
标准所说的本质上就是不同的对象(变量等)。一定有不同的地址。这些地址是如何分配的,甚至是真正的地址:这些是实现细节。
为什么变量我得到一个较早的内存地址,然后是变量arr
因为这就是编译器决定要做的。它可以选择相反的顺序,或者把它们放在完全不同的存储区域,如果它愿意的话。如果需要的话,编译器可以选择在奇数天倒序。语言根本不指定任何内容,更不用说保证了。
--当您实际使用变量或给它赋值时,它似乎有一些事情要做。
一个好的优化者很可能选择这样做,因为它最小化了本地使用的存储量。但是(如果这听起来很熟悉的话就阻止我)这是一个实现细节。它可以用不同的编译器标志或者任何东西来改变。
https://stackoverflow.com/questions/58148075
复制相似问题