我正在编写一些代码来获取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 *'
有人可以告诉我,如果我做错了吗?
答案 0 :(得分:3)
您应该使用%p
打印指针,并记住转换为void *
。
printf("%p => ??\n", (void *)&(buffer[i]), ...);
我不确定您要尝试做什么,但如果您尝试将buffer
的一部分解释为长并打印,则可以使用%ld
。
答案 1 :(得分:2)
尝试:
char buffer[10];
for (int i=0;i<20;i++)
printf("%p => 0x%lx\n", (void*)&(buffer[i]), ((long *)buffer)[i]);
第二个arg,&(buffer[i])
属于char*
类型,因此需要演员和%p
。
第3个arg ((long *)buffer)[i]
属于long
类型,因此需要%lx
。
<小时/> 除了:请注意,如果
buffer
不是long
- 对齐,您可能得到正确答案,错误答案或核心转储,这些都取决于您的CPU,操作系统,操作系统设置和/或编译器。
如果是 me ,我会尝试:
long l;
for(int i = 0; i < 20; i++)
printf("%p => 0x%lx\n", (void*)(&l+i), *(&l+i));