我用这个printf()丢失了信息吗?

时间:2013-03-04 18:32:28

标签: c printf compiler-warnings

专家C编程中,第146页有一个练习,用于说明典型的Unix操作系统如何将a.out文件的各个段分配到各种内存段中以供执行。

“首发”代码是:

main () {
   int i;
   printf("The stack top is near %#X\n", &i);
}

编译器发出警告,但没有错误,%X&i的使用:

warning: format ‘%X’ expects argument of type ‘unsigned int’, but argument 2 has type ‘int *’ [-Wformat]

作为内存布局和十六进制地址的新手,我只是想知道推荐的格式是不是完全代表了所需的信息?我四处搜索但找不到任何确定的东西 - 例如,我读到了使用%p格式提示,但目前尚不清楚这是否是必要的。

此外,这本神圣的C书会出现这样的错误似乎令人怀疑,所以我认为这是对这个用例的无关警告,但我想确定。

1 个答案:

答案 0 :(得分:2)

   int i;
   printf("The stack top is near %#X\n", &i);

这是未定义的行为。 X转换说明符需要类型为unsigned int的参数,但&i是指向int的指针类型。如果出现未定义的行为,C不需要执行中止转换,但C允许中止转换。

要使用p转换说明符打印指针值:

   int i;
   printf("The stack top is near %p\n", (void *) &i);