一个进程在内存中有5个区域
1. 程序代码区
用于存放程序代码,程序员一般不用关心。
2. 文字常量区
一般定义字符串时,字符串内容是在文字常量区的:
char* s = "hello, world"; //指针s指向内存中的常量区的"hello, world"
3. 全局(静态)存储区
全局变量,静态(static)变量是一起的,都放在全局(静态)存储区,全局(静态)存储区中存放的数据会一直保存直到被新的数据覆盖或者进程退出。
以上3部分的内存分配,在编译时就已经完成。
4. 栈
局部变量、函数参数、函数入口地址等存放于栈中。主要是存放临时性数据,变量的有效性会随着程序的运行而改变,例如退出函数以后,函数中的局部变量就会被‘踢出’栈中。linux系统默认栈大小为8M。
5. 堆
程序员用malloc系列函数申请出来的内存就是在堆里的,堆于栈相比,堆的可用大小相对不受限制(如果连续内存不够,也会失败),堆中数据的有效周期直到主动调用free()函数或者进程结束。
总之:如果要想实现数据的较长期储存,可以放在全局(静态)存储区和堆,下次访问时仍然可以取到上次运行的结果。
下面分析一段代码:
#include <stdio.h>
char c='A'; //全局变量c储存于全局(静态)区
static int m; //静态全局变量m储存于全局(静态)区
int main(int argc, char *argv[])
{
int a; //变量a储存于栈中
static int k=1; //静态局部变量k储存于全局(静态)区
char *p = "hello~"; //指针变量p储存于栈中,指向常量区的字符串"hello~"
char *s = (char *)malloc(sizeof(char) * 10); //指针变量s指向堆中的一块大小为10字节的内存位置
if (s)
{
......
}
......
}