问题描述
我试图更好地理解堆栈是如何工作的,我编写了这个程序。
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#define SIZE 0
void proof(){
unsigned int buf[SIZE];
unsigned int i = 0;
printf("buf is at %X\n",(unsigned int)buf);
//printf("return address is at buf[size+4] %X\n",(unsigned int)buf[SIZE+4]);
//printf("return address is at buf[size]+16 %X\n",(unsigned int)&buf[SIZE]+12);
printf("Effective return address %p\n",__builtin_return_address(0));
printf("Proof address %p\n",&proof);
}
void main(){
proof();
}
我想象的堆栈是这样的:
返回地址 |
---|
上一帧指针 |
变量 i |
buf[SIZE] |
从输出中我可以看到这个函数的返回地址被放置在 buf[size+4]
中,但我不明白为什么。返回地址不应该总是在 ebp+4
吗?我曾尝试使用 gdb 获取 ebp
的地址,但它与我从代码中获得的地址不同。而且,在这种情况下,如果堆栈像我想象的那样,那么返回地址不应该在 &buf[SIZE]+12
处,因为我们正在乘以 4 移动吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)