0

Expert C Programming中,第 146 页上有一个练习,旨在说明典型的 Unix OS 如何将a.out文件的各个段分配到各个内存段中以供执行。

“入门”代码是:

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

编译器会警告但不会出错,使用%Xwith &i

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

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

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

4

1 回答 1

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);
于 2013-03-04T18:34:11.480 回答