进程的内存映射
1、如何查看一个进程的内存映射?
使用:cat /proc/进程的pid/maps(进程的pid获取见getpid函数)

例:
char buf[]="aaaaa";
char *str="aaaaa";
printf("buf%p\n",buf);//输出字符串数组的首地址
printf("str's addr=%p\n",&str);
printf("str's comt=%p\n",str);

这里需要注意,局部变量,函数形参被分配到栈,静态的局部变量和全局变量在数据段中,字符串在代码段中,使用malloc等申请的空间分配在堆中。buf[]中的字符串内容和str指向的字符串内容虽然都是“aaaaa”。但是buf[]中的内容是程序在执行的时候,将“aaaaa”拷贝到buf[]中的。也就是说buf[]中存在实实在在的字符串数据。
(1)同时,也可以看出初始化和赋值的区别。如:
在上述语句中,将char buf[]="aaaaa";改为char buf[12];
增加 buf="aaaaa";
这句语句将代码段的“aaaaa”首地址赋值给buf,即让buf指向代码段字符串,而本身buf是指向栈中的字符串的,buf是一个固定的常量,不能被赋值,而str这种指针变量可以被赋值改变指向的地址。而初始化就如同上述,将字符串拷贝到buf[]中,而不是改变buf所指地址。如要实现赋值拷贝,可以使用strcpy函数。
(2)另外:
如有以下定义:char *p;*p='m';
因为指针还未进行初始化或者赋值,p是一个悬空指针。为非法地址。编译可以通过,但是无法执行。
(3)有如下子函数
void count(void){
int c=1;
static int c1=1;
c++;
c1++;
printf("c=%d,%d\n",c,c1);
printf("c addr=%p\n",&c,&c1);
return;
}
在主函数中使用for循环调用6次count函数,使用cat查看maps文件内的内存映射,可以看到c被分配到栈段,c1被分配到数据段。故生命周期不同。如下图所示

2、获取进程信息
获取进程的ID号:
pid_t getpid(void);
功能:
获取进程的pid
参数:
void
返回值
调用进程的pid
包含头文件:#include<sys/types.h>、#include<unistd.h>