我正在尝试在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
现在我的问题是我接受哪个作为我号码的位置
答案 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;
}
所有数字都是等价的,因为它们代表与地址相同的位模式。十六进制往往是地址的首选符号,但八进制(未显示)也有很长的历史(但需要比十进制更多的数字)。