【发布时间】:2015-04-18 00:02:24
【问题描述】:
我试图了解 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 低?堆栈变量是否倒置存储?
【问题讨论】:
-
我认为它是实现定义/或未指定。检查这个答案stackoverflow.com/a/4105123/1673391
-
这完全依赖于平台,但是很多主流平台实际上是从代码/数据部分向上增长堆,从(可用)内存的顶部向下增长堆栈。你应该从不在你的 C 代码中依赖它,但是......
-
int* prev = i - 1;太简单了不能达到同样的效果吗? -
C 不分配任何东西。这是一个规范。它完全没有说明您要检查的内容。这意味着您不能以任何方式依赖您从实验中获得的结果。或者确实赋予它们任何意义。
-
要了解为什么您的实验没有意义,请查看here。
标签: c pointers stack memory-address