note
linux进程的内存布局查看:cat/proc/pid/maps
code
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int var1 = 111; // 只可读数据段
const int var2 = 222; // 可读可执行代码段
int main(int argc, char** argv) {
printf("pid:%d\n", getpid());
static int var3 = 333; // 可读可写数据段
char* str1 = "hello world";
char* str2 = "hello world";
char buf[32] = "hello world";
char* p = (char*)malloc(32);
printf("&var1:%p\n", &var1);
printf("&var2:%p\n", &var2);
printf("&var3:%p\n", &var3);
printf("str1:%p,str2:%p\n", str1, str2); // str1=str2,位于可读可执行的代码段
printf("&str1:%p,&str2:%p\n", &str1, &str2); // str1!=str2,位于可读可写的栈段
printf("buf:%p,&buf:%p\n", buf, &buf); // buf=&buf,在栈上给buf分配32字节空间,再把"hello world"从代码段拷贝到buf
printf("p:%p,&p:%p\n", p, &p); // p指向可读可写的堆段,p位于可读可写的栈段
getchar();
free(p);
exit(0);
}
addition
linux的进程空间为虚拟内存空间,相同属性的数据所处的段和裸机的段位置有所不同;
例如在裸机里,const int var2应该位于只读数据段