gpt4 book ai didi

c - 缓冲区分配不是字大小的倍数

转载 作者:太空宇宙 更新时间:2023-11-04 00:07:17 24 4
gpt4 key购买 nike

我写了一个小程序来理解栈的结构。

#include <stdio.h>

void function(int a, int b, int c) {
char buffer1[5];
char buffer2[10];

int *ret = buffer1 + 13;
(*ret) += 8;
}

int main() {
int x = 0;
function(1,2,3);
x = 1;
printf("x = %d\n",x);
return 0;
}

到目前为止我已经知道堆栈遵循以下模式

    ------------------
| arguments | High
------------------
| return address |
------------------
| ebp |
------------------
| buffer1 |
------------------
| buffer2 | Low
------------------

我还了解到,如果我们分配 5 个字节的数据,程序会分配 8 个(因为它必须是字大小的倍数)。

函数 function 的汇编代码转储:

0x08048414 <+0>:    push   %ebp
0x08048415 <+1>: mov %esp,%ebp
0x08048417 <+3>: sub $0x20,%esp
0x0804841a <+6>: lea -0x9(%ebp),%eax
0x0804841d <+9>: add $0xd,%eax
0x08048420 <+12>: mov %eax,-0x4(%ebp)
0x08048423 <+15>: mov -0x4(%ebp),%eax
0x08048426 <+18>: mov (%eax),%eax
0x08048428 <+20>: lea 0x8(%eax),%edx
0x0804842b <+23>: mov -0x4(%ebp),%eax
0x0804842e <+26>: mov %edx,(%eax)
0x08048430 <+28>: leave
0x08048431 <+29>: ret

汇编程序转储结束。

现在我在 gdb 下运行程序,我明白了,

(gdb) x/x $ebp
0xbffff318: 0xbffff348
(gdb) x/x buffer1
0xbffff30f: 0xfc73e461
(gdb) x/x buffer2
0xbffff305: 0x0108049f

这里是我的疑问buffer1buffer2之间的差异怎么会是10,当所有的东西都被分配的时候字数的倍数。

另外,%ebp 和 buffer1 之间的 9 有何不同?

这里到底发生了什么?

注意:

  • 考虑堆栈从高增长到低
  • 字数 = 4
  • 我正在使用 Intel 处理器、Ubuntu 12.04、32 位并使用

    gcc -o stack -g -fno-stack-protector -O0 main.c

构建。

最佳答案

Here's my doubt, how can the difference between buffer1 and buffer2 be 0x10, when everything is allocated in a multiple of wordsize.

首先,更正:buffer1buffer2 之间的区别是 10,而不是 0x10(这是16).

其次,并非所有都分配在多个单词中。 帧大小将至少被 8 整除,以保持堆栈为 doubles 正确对齐,但 individual 局部变量将仅通过任何方式对齐它们的对齐要求是(字符和字符缓冲区为 1)。

关于c - 缓冲区分配不是字大小的倍数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18541808/

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