在专家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书会出现这样的错误似乎令人怀疑,所以我认为这是对这个用例的无关警告,但我想确定。
答案 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);