c - 为什么函数堆栈帧中的参数、变量和帧指针之间存在间隙?
问题描述
我有以下c程序:
void function(int a, int b, int c) {
char buffer1[]="aaaaa";
char buffer2[]="bbbbbbbbbb";
}
int main() {
function(1,2,3);
return 0;
}
当我在执行函数时打印帧信息时,我得到以下 gdb 输出:
(gdb) info frame
Stack level 0, frame at 0x7fffffffe1c0:
rip = 0x40119b in function (ss1.c:4); saved rip = 0x4011ca
called by frame at 0x7fffffffe1d0
source language c.
Arglist at 0x7fffffffe1b0, args: a=1, b=2, c=3
Locals at 0x7fffffffe1b0, Previous frame's sp is 0x7fffffffe1c0
Saved registers:
rbp at 0x7fffffffe1b0, rip at 0x7fffffffe1b8
(gdb)
打印函数参数和局部变量的地址时,我得到:
(gdb) p/x &c
$65 = 0x7fffffffe184
(gdb) p/x &b
$66 = 0x7fffffffe188
(gdb) p/x &a
$67 = 0x7fffffffe18c
(gdb) p/x &buffer1
$68 = 0x7fffffffe197
(gdb) p/x &buffer2
$69 = 0x7fffffffe19d
为什么 arg a 的地址和 var buffer1 的地址之间有 11 个字节的间隙 - 而不仅仅是 a 大小的 4 个字节的间隙?
为什么 buffer2 的地址和帧指针 (0x7ffffffffe1b0) 之间有 19 个字节的间隙 - 而不仅仅是 buffer2 的大小的 11 个字节的间隙?
谢谢
解决方案
只需运行简单的程序:
#include <stdio.h>
void function(int a, int b, int c)
{
char buffer1[]="aaaaa";
char buffer2[]="bbbbbbbbbb";
printf("%p = &a\n", &a);
printf("%p = &b\n", &b);
printf("%p = &c\n", &c);
printf("%p = &buffer1 sizeof(buffer1) = %zu\n", buffer1, sizeof(buffer1));
printf("%p = &buffer2 sizeof(buffer2) = %zu\n", buffer2, sizeof(buffer2));
printf("%zu = &buffer - &a\n", (char *)buffer1 - (char *)&a);
}
int main()
{
function(1,2,3);
return 0;
}
结果完全符合预期。
0x7fff9d9d830c = &a
0x7fff9d9d8308 = &b
0x7fff9d9d8304 = &c
0x7fff9d9d8310 = &buffer1 sizeof(buffer1) = 6
0x7fff9d9d8320 = &buffer2 sizeof(buffer2) = 11
4 = &buffer - &a
尝试在您的系统上运行它。
推荐阅读
- c# - 鼠标拖动操作失败。使用方法“mysql_native_password”向用户“root”验证主机“serverN”失败并显示消息:访问被拒绝
- python - 无法与在云中运行的 websocket 服务器建立连接
- android - 如何在 Kotlin 中为两种类型的数据类映射器使用通用扩展函数
- python - TypeError:'int' 对象不可下标?pow() 有问题吗?
- android - 在Android上单击KML中的标记时如何在标记内显示所需信息
- javascript - 为什么在 devtools 中复制样式会变得如此混乱?
- python - 将 pandas 数据框中的列表传递给 sklearn 以用于 TF IDF
- python - 如何在 python 中使用 Selenium 获取价格?
- javascript - 如何阻止父 div 拉伸到子 div 的高度?
- sql - 如何获得 2 列中的小时、分钟和秒的总和?