1

我正在玩弄格式字符串,发现很难理解如何从堆栈中检索参数。这是我的示例代码:

#include <stdio.h>

int main(int argc, char **argv)
{
  int i = 123321;
  char a[] = "AAAAA";
  printf(argv[1]);
  printf("\n");
  return 0;
}

现在,我一直在调试器中运行程序,试验输入,所以像“AAA %x %x”这样的东西,并查看堆栈指针和基指针之间的内存段,试图找出哪些格式说明符得到了换成哪个词。

这会导致一些混乱。我用“AAAAA %x %x %x %x %x %x %x %p %p %x %x %x %x %x”运行程序,如下图所示。

在此处输入图像描述

之后,我检查了从堆栈指针开始的内存,一直到基指针并超出了基指针。从输出的 0x4141414141 和 0x1e1b9ca70c100 值可以看出,它们是数组 a[]="AAAAA" 和值 i=123321 (=0x1e1b9),我能够使用以下格式将局部变量输出给我细绳。但是,如果我将两个 %p 替换为两个 %x,那么我只会得到数组的一部分(因为它大于一个单词),并且根本不会输出 0x001e1b9(i 的值)。为什么这些 4 字节的值不会从堆栈中弹出?我必须使用 %p,否则它似乎只是跳过堆栈上的这些单词并弹出不同的东西。这是否与局部变量在堆栈上的对齐方式有关?

谢谢,砖

4

0 回答 0