C语言分为4个存储区域:
代码区
静态存储区
栈区
堆区
代码区:存放编译后的可执行代码的区域。
静态存储区:存储着静态变量(static修饰的变量 如:static int a; ) 和一些常量(如 char *p="abcd"; 其中的“abcd”就是存储在静态存储区的 并且被认为是只读的)以及全局变量
,全局变量和静态变量在分配内存时会被初始化器初始化为类型0。
栈区:存放函数的形参和局部变量(包括复合类型的局部变量) 例如在main函数中定义一个int a; 编译器就会在栈区分配4个字节给a。
堆区:C语言中用malloc realloc calloc 函数分配的动态内存都在堆区,如 char *p=(char*)malloc(10); 则p为指针,是一个局部变量,在栈区。p所指向的地址为堆区动态分配的空间,堆区由操作系统进行管理(可以认为有一个空闲内存分配表)
举例:
static int a; //a是静态变量 其空间在静态存储区,占4个字节
int main()
{
int b; //b是一个局部变量,分配在栈区,本函数结束后被销毁。
char *p1="abcd" /*p1是一个局部变量 在栈区分配,占4个字节(32位系统下),其值为一个地址,它指向静态存储区的一个常量字符串的首地址,该字符串长度5位 分别是 'a' 'b' 'c' 'd' 'e' '\0' */
int * p2=(int*)malloc(sizeof(int)*10); /*p是一个局部变量,在栈区分配4个字节(同上),它指向堆区的一个长度为10个int型大小的空间的首地址 */
return 0;
}