用C语言组织堆栈上的数据?

用C语言组织堆栈上的数据?,c,function,C,Function,我正在学习C语言,有一些问题。 当我们声明一个变量时,比如int i=0。i在堆栈中有地址,对吗 我想知道函数在内存中是如何组织的。例如,我有一个函数: int myF() { int x = 2, y = 3; int z = x + y; return x; } 这个方法在堆栈中是如何组织的?我是说名称“myF”与其他变量一样也有一个内存地址?并且“myF”应该有类似于结束地址的内容来指示函数的结束位置 我错了吗 非常感谢。通常函数的代码单独存储在只读内存段中,堆栈(“自动存储

我正在学习C语言,有一些问题。 当我们声明一个变量时,比如
int i=0
i在堆栈中有地址,对吗

我想知道函数在内存中是如何组织的。例如,我有一个函数:

int myF() {
  int x = 2, y = 3;
  int z = x + y;
  return x;
}
这个方法在堆栈中是如何组织的?我是说名称“myF”与其他变量一样也有一个内存地址?并且“myF”应该有类似于结束地址的内容来指示函数的结束位置

我错了吗


非常感谢。

通常函数的代码单独存储在只读内存段中,堆栈(“自动存储”)不会与之重叠。此外,在编译过程中,名称
myF
被删除,函数变成一段代码,从某个地址开始,以一条特殊的处理器指令结束,意思是“从当前函数返回”。

图表将帮助显示它的组织方式:

  • 局部变量(如示例中的
    i
    )可能在堆栈上,但它取决于编译器。典型的堆栈布局将显示局部变量区域,但是,例如,一些编译器可能会使用一个寄存器来代替变量
  • 名称
    myF
    没有地址,但函数有地址。地址通常位于可执行代码的单独区域中
  • 没有“结束地址”-而是由调用函数保存返回地址。当
    myF
    到达函数末尾并执行任何清理操作时,它将分支到返回地址。这实际上可能是一个问题,因为存在一些试图更改此返回地址并导致代码分支到要执行的恶意代码的漏洞
我在堆栈中有地址,对吗

不一定

这个方法在堆栈中是如何组织的

答案是它取决于编译器和处理器体系结构。有些编译器在堆栈上存储局部变量。其他人将使用寄存器


查看此问题以进行更多讨论。

根据编译器的不同,创建C代码的汇编列表可能会有所帮助,这样您可以看到指令并更好地了解其工作原理。C不指定堆栈,因此自动变量的布局方式以及位置,取决于具体的实现。通常情况下,变量最终会出现在堆栈中,但它们可以完全优化,或者只存在于寄存器中。不要假设编译器是如何翻译代码的。+1表示插入反汇编代码的想法