带有&符号和pmap的可变内存位置

时间:2014-10-23 18:19:25

标签: c memory

我刚刚开始处理 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

我在这里想念的是什么?

4 个答案:

答案 0 :(得分:2)

也许你只是错过了指针值的一半。打印指针的正确格式为%p,在具有64位地址和32位int的计算机上,这使得"重要"差。

答案 1 :(得分:2)

我认为你错过了两件事:

  1. 您的内存地址空间似乎是64位,因此您应该使用%p代替%x

  2. 您要打印的变量是局部变量,因此位于堆栈的某个位置。

  3. 打印完整的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