为什么malloc返回值不在进程内存映射中?

为什么malloc返回值不在进程内存映射中?,c,pointers,memory,memory-management,C,Pointers,Memory,Memory Management,我现在正在使用OS X 10.10.5,我正在做一个关于malloc和heap的实验,如下所示: #include <stdio.h> #include <stdlib.h> int main() { int *p; p = malloc(sizeof(int)); *p = 100; printf("the malloc p pointer addr is %x\n", p); getchar(); } #包括 #包括 int

我现在正在使用OS X 10.10.5,我正在做一个关于malloc和heap的实验,如下所示:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int *p;
    p = malloc(sizeof(int));
    *p = 100;
    printf("the malloc p pointer addr is %x\n", p);
    getchar();
}
#包括
#包括
int main(){
int*p;
p=malloc(sizeof(int));
*p=100;
printf(“malloc p指针地址是%x\n”,p);
getchar();
}
输出为
malloc p指针地址为c3404ba0

我认为地址
0xc3404ba0
是由maclloc作为进程堆的一部分分配的

然后我使用
vmmap
工具获取内存映射,结果是:

我们可以看到
0xc3404ba0
不在堆区域中,但它实际上是指向已分配内存的指针。怎么了


它现在修复了,当我使用%p而不是%x时,输出是
malloc p pointer addr是0x7fe131404ba0

vmmap输出为:


感谢@Alex Lop.

正如我在评论中所写的,看起来您正在64位操作系统上运行。如果您的程序是在64位模式下编译的,那么使用
%x
打印指针将切断较高的32位(因为
%x
用于整数)。用
%p
试试同样的方法,然后发布结果

我猜
0xxxxxxxxc3404ba0
属于该范围:


正如我在评论中所写,看起来您运行的是64位操作系统。如果您的程序是在64位模式下编译的,那么使用
%x
打印指针将切断较高的32位(因为
%x
用于整数)。用
%p
试试同样的方法,然后发布结果

我猜
0xxxxxxxxc3404ba0
属于该范围:


看起来您正在64位操作系统上运行。如果您的程序是在64位模式下编译的,那么使用
%x
打印指针将切断较高的32位。请改为对
%p
执行相同的操作,并发布结果。使用错误的格式说明符调用未定义的行为看起来像是在64位操作系统上运行。如果您的程序是在64位模式下编译的,那么使用
%x
打印指针将切断较高的32位。请改为对
%p
执行相同操作,并发布结果。使用错误的格式说明符会调用未定义的行为