【问题标题】:Cast char* to int将 char* 转换为 int
【发布时间】:2012-08-07 23:35:45
【问题描述】:

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

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

【问题讨论】:

  • 编译器几乎可以告诉你你做错了什么。而且一切都是未定义的行为:-(
  • 你也在访问未分配的内存,尤其是作为long指针访问缓冲区。
  • @KerrekSB,感谢您的帮助。

标签: c pointers casting dereference


【解决方案1】:

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

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

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

【讨论】:

  • 问题不在于打印指针,而是取消对演员表的引用。第二个参数导致编译错误。
  • @Robᵩ 实际上我不确定。然而,警告是由“argument 2”引起的。
  • @cnic 抱歉,我一直将第二个参数解释为第二个参数,不包括字符串。哎呀
【解决方案2】:

试试:

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

第二个参数&amp;(buffer[i])char* 类型,所以它需要一个演员表和一个%p

第三个参数((long *)buffer)[i]long 类型,因此它需要%lx


除此之外:请注意,如果 buffer 不是 long-aligned,您可能会得到正确答案、错误答案或核心转储,这取决于您的 CPU、操作系统、操作系统设置, 和/或编译器。

如果是,我会试试:

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

【讨论】:

  • %p 需要 void*
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-25
  • 2015-11-23
  • 2015-12-18
  • 2017-04-25
  • 2015-01-29
  • 1970-01-01
相关资源
最近更新 更多