#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/types.h>
void *threadFunc(void *arg)
{
void *ptr = malloc(1000);
printf("thread heap'addr = %p\n", ptr);
int i = 3;
printf("thread stack'addr = %p\n", &i);
getchar();
}
int main()
{
pthread_t child;
pthread_create(&child, NULL, threadFunc, NULL);
sleep(10000);
return 0;
}
结果打印 指针ptr所在的地址=0x7fe840000b60 变量 i 所在的地址=0x7fe847399edc
查看进程的maps  指针ptr和变量 i 所在的地址分别落在上图中箭头指向的地址区间内. 这些区间都是内存映射区.
如上图,虽然有个 [heap]表示的区间 但是这个[heap]区间是表示主线程分配的内存, 并不是子线程分配的内存区间. 子线程分配的内存区间都在内存映射区,底层通过调用mmap申请的内存空间, 包括子线程的栈空间和子线程的堆空间都在这块内存空间.
在某篇文章中看到这么一句话,如下 图中圈选的地址空间, 间隔正好就是64M.
|