将char *转换为int

时间:2012-08-10 16:14:31

标签: c pointers casting dereference

我正在编写一些代码来获取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 *'

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

2 个答案:

答案 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));