内存地址c中的正值或负值?

7 c memory-address

在c中,我试图打印出变量的地址和某些功能的地址.我得到一个是负值,另一个是正值.我的问题是:为什么C不代表所有负面或全部正值?

这是我的代码:

int foo() { 
     return 0;
}

int main() {

    int a;
    printf("%d\n",&a);

    printf("%d\n",foo);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

结果如下:

-1075908992 134513684
Run Code Online (Sandbox Code Playgroud)

Ada*_*eld 29

不应以这种方式将内存地址解释为有符号整数.数字的符号取决于最高位集(假设当前正在使用的绝大多数系统使用的是二进制补码表示),因此32位系统上的0x80000000以上的存储器地址将为负数,并且存储器地址低于0x80000000将为正数.对此没有实际意义.

您应该使用%p修饰符打印内存地址; 或者,有些人%08x用于打印内存地址(或%016llx64位系统).这将始终打印为十六进制的无符号整数,这比带符号的十进制整数更有用.

int a;
printf("%p\n", &a);
Run Code Online (Sandbox Code Playgroud)

  • `%08x`是不可移植的(例如,实际上会在LLP64平台上混乱). (2认同)
  • 是的,这就是为什么你应该使用`%p`,但仍然值得一提的是很多人在32位机器上使用`%08x`.99%的时间,如果你打印出一个指针值,你正在调试一些东西,所以你确切地知道你正在运行什么样的架构. (2认同)

pmg*_*pmg 7

要成为最符合标准的符合,请在格式字符串中传递"%p" printf()并将参数转换为void*.

printf("%p\n", (void*)&a);
printf("%p\n", (void*)foo);
Run Code Online (Sandbox Code Playgroud)

引自标准草案(n1401.pdf)

    7.20.6.1 The fprintf function

8   The conversion specifiers and their meanings are:

p       The argument shall be a pointer to void. The value of the pointer
        is converted to a sequence of printing characters, in an
        implementation-defined manner.

  • 我建议按照你自己的建议在示例代码中用`%p`替换`%d` (2认同)

Ara*_*raK 6

你应该传递指针格式化程序:

printf("%p\n",foo);
Run Code Online (Sandbox Code Playgroud)