1

我正在编写一些代码来获取 c 中堆栈的十六进制转储。当我在 ubuntu 中使用 gcc 编译它时,我在以下行中不断收到编译错误,但是它在 windows 中的 gcc 下编译得很好。

char buffer[10];
for (int i=0;i<20;i++)
    printf("0x%lx => 0x%lx\n", &(buffer[i]), ((long *)buffer)[i]);

这是编译器给出的信息。

警告:格式“%lx”需要类型“long unsigned int”,但参数 2 的类型为“char *”</p>

如果我做错了什么,有人可以告诉我吗?

4

2 回答 2

3

您应该使用%p打印指针,并记住转换为void *.

printf("%p => ??\n", (void *)&(buffer[i]), ...);

我不确定您要做什么,但是如果您尝试将一部分解释buffer为 long 并打印出来,那么您可以使用%ld.

于 2012-08-10T16:15:48.050 回答
2

尝试:

char buffer[10];
for (int i=0;i<20;i++)
    printf("%p => 0x%lx\n", (void*)&(buffer[i]), ((long *)buffer)[i]);

第二个参数&(buffer[i])是 type char*,所以它需要一个 cast 和一个%p.

第三个参数 ,((long *)buffer)[i]的类型是long,所以它需要一个%lx.


旁白:请注意,如果bufferlong对齐,您可能会得到正确答案、错误答案或核心转储,这一切都取决于您的 CPU、操作系统、操作系统设置和/或编译器。

如果是,我会尝试:

long l;
for(int i = 0; i < 20; i++)
    printf("%p => 0x%lx\n", (void*)(&l+i), *(&l+i));
于 2012-08-10T16:19:35.540 回答