【发布时间】:2017-01-25 21:00:15
【问题描述】:
我目前正在学习 C,但我对内存布局和指针感到困惑。
在下面的代码中,我的理解是数组是在栈上分配的。
#include <stdio.h>
int main () {
int x[4];
x[0] = 3; x[1] = 2; x[2] = 1;
printf("%p\n",x);
printf("%p\n", &x);
}
我的问题是,为什么两个打印调用输出相同的值?
我尝试了类似的使用 malloc 的 sn-p(在堆上分配),但值不同。
#include <stdio.h>
#include <stdlib.h>
int main () {
int *x = malloc(sizeof(int) * 4);
x[0] = 3; x[1] = 2; x[2] = 1;
printf("%p\n",x);
printf("%p\n", &x);
}
【问题讨论】:
-
C 不需要为自动变量使用堆栈。那是特定于实现的。而且数组不是指针。
-
@Olaf 它是特定于实现的,因为所有实现都专门在堆栈上分配;-)。
-
@PeterA.Schneider:有一些像 PIC 这样的嵌入式 CPU 没有硬件堆栈。并且有一些实现,例如HC08 允许出于性能原因静态分配自动变量。优化的 ABI 可能会在寄存器中传递数组并复制回来。一个实现可以做很多事情,并且认为太多是理所当然的编写代码的好方法,它会破坏好的编译器。世界比我们想象的要大...关于获取数组的地址:试试
register int a[10];。 -
@joop 当然:我知道,但从未说过。该标准实际上不包含“堆栈”一词。但当然,人类已知的所有实现都提供一个。请注意,您正在进入关于堆栈的本体论讨论:什么是堆栈?我并不是说堆栈具有寄存器 ESP,或 any 类型的硬件支持,或某种内存布局。也许我们需要一个堆栈图灵测试:如果它的行为像一个堆栈,它就是一个堆栈,但是它是如何实现的?您所描述的只是一个复杂的堆栈实现,因此不太可能使用更简单的堆栈实现。
标签: c pointers malloc heap-memory stack-memory