一个简单的int值的地址

时间:2011-12-12 02:49:28

标签: c pointers

我正在尝试在C中找到特定变量的地址位置,现在我尝试编写一个代码:

#include<stdio.h>

int main()
{
        int g = 3;
        printf("%p %d %u ",&g,&g,&g);
        return 0;
}

现在我很困惑,为什么GCC编译器会使用这些来警告我们:

警告

warning: format '%d' expects type 'int', but argument 3 has type 'int *'
warning: format '%u' expects type 'unsigned int', but argument 4 has type 'int *'

答案也非常惊人

0xbfa5953c -1079667396 3215299900

现在我的问题是我接受哪个作为我号码的位置

3 个答案:

答案 0 :(得分:4)

在每种情况下,表达式&g的计算结果都是相同的值(按位)。这只是如何解释的问题。

事实证明,0xbfa5953c(hex)== 3215299900(dec),这并不奇怪。负值没有意义,因为内存地址不是 signed 整数。

答案 1 :(得分:0)

第一个是正确的位置 - 另一个如果打印为无符号十六进制也会给你相同的值。

请注意,这不是物理内存中的确切位置(甚至是近距离) - 因为现在几乎所有现代操作系统都使用虚拟寻址。

答案 2 :(得分:0)

假设你可以使用C99,你可以使用:

#include <stdio.h>
#include <inttypes.h>

int main(void)
{
    int g = 3;
    printf("%p %" PRIdPTR " %" PRIuPTR "\n", &g, (intptr_t)&g, (uintptr_t)&g);
    return 0;
}

所有数字都是等价的,因为它们代表与地址相同的位模式。十六进制往往是地址的首选符号,但八进制(未显示)也有很长的历史(但需要比十进制更多的数字)。