我刚开始处理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我在这里错过了什么?
发布于 2014-10-23 18:25:23
我想你错过了两件事:
%p而不是%x。打印完整的8字节地址后,您将看到这两个地址都位于堆栈中。
换句话说,在从地址0x00007fff79780000开始的84-K字节内存部分中。
顺便说一下,在传递指向printf的指针时,通常应该在任何情况下使用%p。
在32位系统上,使用%x会产生与%p相同的结果。
发布于 2014-10-23 18:24:18
也许您只是丢失了指针值的一半。打印指针的正确格式是%p,在具有64位地址和32位int的机器上,这造成了“显着”的差异。
发布于 2014-10-23 18:26:57
在64位指针上使用32位%x的输出前缀,即7fff,您可以在堆栈的底部:7ffff79780000上找到您的var/s。
使用%p打印指针,方法是在此之前将指针转换为void*:
printf("Address of var1 variable: %p\n", (void*) &var1);https://stackoverflow.com/questions/26534699
复制相似问题