gpt4 book ai didi

c - C堆栈变量是否反向存储?

转载 作者:太空狗 更新时间:2023-10-29 17:17:51 25 4
gpt4 key购买 nike

我想了解 C 如何在堆栈上分配内存。我一直认为堆栈上的变量可以描述为结构成员变量,它们在堆栈中占据连续的、连续的字节 block 。为了帮助说明我在某处发现的这个问题,我创建了这个重现该现象的小程序。

#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 低?堆栈变量是否颠倒存储?

最佳答案

堆栈组织完全未指定并且特定于实现。实际上,它在很大程度上取决于编译器(甚至是其版本)和优化标志。

有些变量甚至不在堆栈上(例如,因为它们只是保存在某些寄存器中,或者因为编译器优化了它们 - 例如通过内联、常量折叠等)。

顺便说一句,您可以有一些不使用任何堆栈的假设 C 实现(即使我不能说出这样的实现)。

要了解有关堆栈的更多信息:

遗憾的是,我不知道可以在语言级别访问调用堆栈的低级语言(如 C、D、Rust、C++、Go 等)。这就是为什么为 C 编写垃圾收集器很困难(因为 GC-s 需要扫描调用堆栈指针)...但是请参阅 Boehm's conservative GC一个非常实用和务实的解决方案。

关于c - C堆栈变量是否反向存储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28559007/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com