C语言的数据存储区
2015-10-19 20:25
211 查看
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;
}
代码区
静态存储区
栈区
堆区
代码区:存放编译后的可执行代码的区域。
静态存储区:存储着静态变量(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;
}
相关文章推荐
- 【黑马程序员】C语言指针总结
- c++ 编译错误is not a static member of ...
- C/C++ 之 fill ()的运用及与memset()的区别
- C++--------------------------------------------模板
- 雪*C语言核心知识总结五
- protobuf源码解析
- C语言的传值与传址调用
- C语言中的break、continue和goto三者的区别与用法
- C语言基础
- 三角形 算法第一集
- 学习C语言的数组
- C++STL学习(7)各种容器总结
- C语言强制类型转换
- 借刀杀对象--Raii技法(C++版)
- 《C++ Primer 5th》读书笔记3---关于类的构造函数
- 设计模式之工厂方法模式
- C语言 ## __VA_ARGS__ 宏
- 【C】用C语言提取bmp图片像素,并进行K-means聚类分析——容易遇到的问题
- C语言中没有string类
- C++入门学习——虚函数表介绍