我正在尝试理解C语言在栈上分配内存的方式。我一直认为栈上的变量可以像结构体成员变量一样表示,它们在栈内占用连续的字节块。为了帮助说明这个问题,我在某处找到了一个示例程序,它重现了这种现象。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void function(int *i) {
int *_prev_int = (int *) ((long unsigned int) i - sizeof(int)) ;
printf("%d\n", *_prev_int );
}
void main(void)
{
int x = 152;
int y = 234;
function(&y);
}
你看到我在做什么了吗?假设 sizeof(int)
是4:我查看传递指针的4个字节,因为这将读取调用者栈中 int y
之前的4个字节。
它没有打印出152。奇怪的是,当我查看下面的4个字节时:
int *_prev_int = (int *) ((long unsigned int) i + sizeof(int)) ;
现在它已经运行,打印出来的是调用栈中
x
变量的内容。为什么x
的地址比y
低?堆栈变量是倒序存储的吗?