我正在学习C语言,有一些疑问。
当我们声明一个变量时,比如 int i = 0
。 i 有堆栈中的地址,对吧?
我想知道函数在内存中是如何组织的。例如,我有一个函数:
int myF() {
int x = 2, y = 3;
int z = x + y;
return x;
}
这个方法在栈中是如何组织的?我的意思是名称“myF”也像其他变量一样具有内存地址?而“myF”应该有类似结束地址的东西来指示函数的结束位置在哪里?
我错了吗?
非常感谢。
最佳答案
图表将有助于展示它是如何组织的:
- 局部变量(如示例中的
i
)可能在堆栈上,但这取决于编译器。典型的堆栈布局会显示局部变量区域,但例如,某些编译器可能会使用寄存器代替变量。 - 名称
myF
没有地址,但函数有。该地址通常位于可执行代码的单独区域。 - 没有“结束地址”——调用函数保存返回地址。当
myF
到达函数末尾并正在执行任何清理操作时,它将分支到返回地址。这实际上可能是一个问题,因为有一些漏洞试图更改此返回地址并导致代码分支到要执行的恶意代码。
关于c - C中堆栈上数据的组织?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5195669/