c - 我用这个 printf() 会丢失信息吗?

标签 c printf compiler-warnings

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

“起始”代码是:

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

%X&i 一起使用时,编译器会发出警告,但不会出错:

警告:格式“%X”需要“unsigned int”类型的参数,但参数 2 的类型为“int *”[-Wformat]

作为内存布局和十六进制地址的新手,我只是想知道推荐的格式是否不能完整代表所需的信息?我四处搜索,但找不到任何明确的信息——例如,我读到有关使用 %p 格式提示的信息,但不清楚这种情况是否有必要。

此外,这本神圣的 C 书籍是否会犯这样的错误似乎值得怀疑,因此我认为这是对此用例的无关警告,但我想确定一下。

最佳答案

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

关于c - 我用这个 printf() 会丢失信息吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15208514/

相关文章:

c++ - 在 C++ 中快速将大量数据写入 ascii 文件

c - 即使经过 6 个小时的编程,我也看不到程序输出的问题

c - 不同次数的 printf 调用的不同输出

c - 找到大于 n 的最小 2 次方

c - 来自脚本的 MQTT 有效负载

c - GCC 没有发出警告,尽管它应该发出警告

c++ - 如何在不使用列表迭代器的情况下避免“"doesn' t 在所有代码路径上返回一个值”警告?

visual-studio - Visual Studio 2010 (C++) : suppress C4706 warning temporarily

c - 等待所有子线程完成(在 C 中)

可以在 GCC 中将 std=c99 设置为默认值吗?