我刚刚开始处理 C 中的指针,还有一件令我困惑的事情......
这是一个简单的代码:
int main ()
{
long ms = 10000000;
int var1;
char var2[10];
printf("Address of var1 variable: %x\n", &var1 );
printf("Address of var2 variable: %x\n", &var2 );
printf("Sizeof of var2 variable: %d\n", sizeof(var2) );
retpid();
millisleep(ms);
return 0;
}
并且 - 它返回 var1 和 var2 内存地址(虚拟内存,我相信?):
$ ./address
Address of var1 variable: 797927b4
Address of var2 variable: 797927a0
Sizeof of var2 variable: 10
PID = 15885
但是 - 当我运行pmap
时 - 我看不到那里的地址:
$ pmap -x 15885
15885: ./address
Address Kbytes RSS Dirty Mode Mapping
0000000000400000 4 4 0 r-x-- address
0000000000600000 4 4 4 rw--- address
00007fcdb6bbc000 1576 256 0 r-x-- libc-2.12.so
00007fcdb6d46000 2048 0 0 ----- libc-2.12.so
00007fcdb6f46000 16 16 16 r---- libc-2.12.so
00007fcdb6f4a000 4 4 4 rw--- libc-2.12.so
00007fcdb6f4b000 20 12 12 rw--- [ anon ]
00007fcdb6f50000 128 104 0 r-x-- ld-2.12.so
00007fcdb7160000 12 12 12 rw--- [ anon ]
00007fcdb716d000 8 8 8 rw--- [ anon ]
00007fcdb716f000 4 4 4 r---- ld-2.12.so
00007fcdb7170000 4 4 4 rw--- ld-2.12.so
00007fcdb7171000 4 4 4 rw--- [ anon ]
00007fff79780000 84 12 12 rw--- [ stack ]
00007fff797ff000 4 4 0 r-x-- [ anon ]
ffffffffff600000 4 0 0 r-x-- [ anon ]
---------------- ------ ------ ------
total kB 3924 448 80
我在这里想念的是什么?
答案 0 :(得分:2)
也许你只是错过了指针值的一半。打印指针的正确格式为%p
,在具有64位地址和32位int
的计算机上,这使得"重要"差。
答案 1 :(得分:2)
我认为你错过了两件事:
您的内存地址空间似乎是64位,因此您应该使用%p
代替%x
。
您要打印的变量是局部变量,因此位于堆栈的某个位置。
打印完整的8字节地址后,您会看到它们都位于堆栈中。
换句话说,在84 KB的内存部分,从地址0x00007fff79780000开始。
顺便说一句,在将指针传递给printf
时,您通常应该使用%p
。
在32位系统上,使用%x
会产生与%p
相同的结果。
答案 2 :(得分:2)
通过在64位指针上使用32位%x
(即7fff
)对输出进行前缀,你会发现你的var / s位于堆栈的底部:{{ 1}}。
使用7ffff79780000
打印指针,然后将它们转换为%p
:
void*
答案 3 :(得分:1)
请注意var2
已经是指针。 &var2
仍然有效,因为它似乎......
这三个都是一样的,但最后一个对我来说不是很合乎逻辑:
var2
&var2[0]
&var2