西安开发网站的公司,设计网站公司收费,西安网站建设 至诚,iis默认网站建设中一般一个程序被加载到内存后执行而成为一个进程。进程在内存中是分区域加载的#xff0c;分别是代码段、数据段、bss段等等。
函数中定义的变量一般存在于栈中。现在我们通过实验验证一下#xff0c;函数中定义的变量#xff0c;到底存在与进程哪个位置。
1.测试程序
#in…一般一个程序被加载到内存后执行而成为一个进程。进程在内存中是分区域加载的分别是代码段、数据段、bss段等等。
函数中定义的变量一般存在于栈中。现在我们通过实验验证一下函数中定义的变量到底存在与进程哪个位置。
1.测试程序
#include stdio.h
#include stdlib.h
#include sys/mman.h
#include string.h
#include stdbool.h
#include unistd.hint main() {int a;char *s;while(true) {scanf(%d,a);s mmap(NULL,4096,PROT_READ|PROT_WRITE,MAP_ANONYMOUS | MAP_SHARED,-1,0);memcpy(s,x,1);printf(%s %p\n,s,s);sleep(10);munmap(s,4096);}return 0;
}
使用mmap在堆上申请一块4096字节的内存并把返回的地址赋值给变量s。
2. 执行程序后查看/proc/pid/maps 3. 输入数字继续查看/proc/pid/maps 对比可知变量s的地址是0x7ffdcab8de70该地址的确在stack范围内
对比第2和第3部的截图还可得知当使用mmap申请堆内存时内核的确会新建一个vm_area_struct结构并加入到mmap链表。