首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可变内存位置与变送器和pmap

可变内存位置与变送器和pmap
EN

Stack Overflow用户
提问于 2014-10-23 18:19:25
回答 4查看 317关注 0票数 3

我刚开始处理C中的指针,还有一件事让我很困惑.

下面是简单的代码:

代码语言:javascript
复制
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内存地址(我相信是虚拟内存?):

代码语言:javascript
复制
$ ./address
Address of var1 variable: 797927b4
Address of var2 variable: 797927a0
Sizeof of var2 variable: 10
PID = 15885

但是-当我运行pmap时,我没有看到这个地址:

代码语言:javascript
复制
$ 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

我在这里错过了什么?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-10-23 18:25:23

我想你错过了两件事:

  1. 您的内存地址空间似乎是64位,所以您应该使用%p而不是%x
  2. 您要打印的变量是局部变量,因此位于堆栈的某个位置。

打印完整的8字节地址后,您将看到这两个地址都位于堆栈中。

换句话说,在从地址0x00007fff79780000开始的84-K字节内存部分中。

顺便说一下,在传递指向printf的指针时,通常应该在任何情况下使用%p

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

票数 2
EN

Stack Overflow用户

发布于 2014-10-23 18:24:18

也许您只是丢失了指针值的一半。打印指针的正确格式是%p,在具有64位地址和32位int的机器上,这造成了“显着”的差异。

票数 3
EN

Stack Overflow用户

发布于 2014-10-23 18:26:57

在64位指针上使用32位%x的输出前缀,即7fff,您可以在堆栈的底部:7ffff79780000上找到您的var/s。

使用%p打印指针,方法是在此之前将指针转换为void*

代码语言:javascript
复制
printf("Address of var1 variable: %p\n", (void*) &var1);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26534699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档