加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 09:54:57 所属栏目:百科 来源:网络整理
导读:我刚刚开始处理C中的指针,还有一个令我困惑的事情…… 这是简单的代码: int main (){ long ms = 10000000; int var1; char var2[10]; printf("Address of var1 variable: %xn",var1 ); printf("Address of var2 variable: %xn",var2 ); printf("Sizeof of
我刚刚开始处理C中的指针,还有一个令我困惑的事情……

这是简单的代码:

int main ()
{

   long ms = 10000000;

   int  var1;
   char var2[10];

   printf("Address of var1 variable: %xn",&var1  );
   printf("Address of var2 variable: %xn",&var2  );
   printf("Sizeof of var2 variable: %dn",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 000000000
int main ()
{

   long ms = 10000000;

   int  var1;
   char var2[10];

   printf("Address of var1 variable: %xn",sizeof(var2) );

   retpid();
   millisleep(ms);

   return 0;
}
int main () { long ms = 10000000; int var1; char var2[10]; printf("Address of var1 variable: %xn",sizeof(var2) ); retpid(); millisleep(ms); return 0; }00 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

解决方法

我认为你错过了两件事:

>您的内存地址空间似乎是64位,因此您应该使用%p而不是%x.
>您正在打印的变量是局部变量,因此位于堆栈中的某个位置.

一旦打印完整的8字节地址,您将看到它们都位于堆栈中.

换句话说,在84 KB内存部分内,从地址0x00007fff79780000开始.

顺便说一句,当传递一个指向printf的指针时,你通常应该使用%p.

恰好在32位系统上,使用%x产生与%p相同的结果.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读