C语言学习第29篇---计算机存储区之 栈 , 堆 , 静态存储区 剖析
谈论下计算机里面的存储器有哪些?
程序中的栈---可以说,没有栈,程序几乎无法运行
1.栈是现代计算机程序中最为重要的概念之一
2.栈在程序中用于维护函数调用上下文
3.函数中的参数和局部变量也存在栈上 (返回地址,寄存器信息等)
栈是一种行为---后进先出
程序中的栈
栈保存了一个函数调用的所需的维护信息
---参数
---返回地址
---局部变量
---调用上下文
---。。。
函数的调用过程
1.每次函数调用都对应这一个栈上的活动记录
---调用函数的活动记录位于栈的中部
---被调用的函数的活动记录位于栈的顶部
函数调用的栈变化1
从main()开始运行
当main调用f()
从f()再回main --- 这就是之前为什么说不要返回局部变量的内存地址
函数调用栈上的数据
1.函数调用时,对应的栈空间在函数返回前是专用的
2.函数调用结束后,栈空间将被释放,数据不再有效
实验1:指向栈数据的指针
-
#include <stdio.h>
-
-
int* g()
-
-
{
-
-
int a[10] = {0};
-
-
return a;
-
-
}
-
-
void f()
-
-
{
-
-
int* pointer = g();
-
-
}
-
-
int main()
-
-
{
-
-
f();
-
-
return 0;
-
-
}
程序中的堆(malloc)
1.堆是程序中的一块预留的内存空间,可由程序员自由使用
2.堆中被程序申请使用的内存在被主动释放前将一直有效
为什么有了栈还需要堆?
1.栈上的数据在函数返回后 就会被释放
2.无法传递函数外部,如:局部变量
C语言程序中通过库函数的调用获得堆空间
---头文件 malloc.h
---malloc -- 一字节的方式申请堆空间
---free ---将堆空间归还给系统
引出一个有趣的点:系统对堆空间的管理方式
---空闲链表法,位图法,对象池法等
会有限找最接近的大小!!!
第三个区
程序中的静态存储区
1.静态存储区随着程序的运行而分配空间
2.静态存储区的生命周期直到程序运行结束
3.在程序的编译期静态存储区的大小就已经确定
4.静态存储区主要是用于保存全局变量和静态局部变量
5.静态存储区的信息最终会保存在可执行程序中
实验2:静态存储区的验证
-
#include <stdio.h>
-
-
int g_v = 1; //全局变量
-
-
static int g_vs = 2; //静态局部变量
-
-
void f()
-
-
{
-
-
static int g_vl = 3;
-
-
printf("%p\n", &g_vl);
-
-
}
-
-
int main()
-
-
{
-
-
printf("%p\n", &g_v);
-
-
printf("%p\n", &g_vs);
-
-
f();
-
-
return 0;
-
-
}
-
-
-
-
/*
-
-
结果是连续的,因为都是存放在静态存储区
-
-
*/
小结:
栈,堆 , 静态存储区 是程序中的基本数据区
1.栈主要是函数调用使用
2.堆主要是用于内存的动态申请和归还
3.静态存储区是保存全局变量和静态变量
文章来源: allen5g.blog.csdn.net,作者:CodeAllen的博客,版权归原作者所有,如需转载,请联系作者。
原文链接:allen5g.blog.csdn.net/article/details/80809314
- 点赞
- 收藏
- 关注作者
评论(0)