在专家 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/