C语言全局变量、局部变量....堆栈等内存问题详解

C语言里面的内存

c语言有五大存储空间

代码区,静态存储区,栈区,堆区、常量区

代码区:就是存放代码的存储区域,它不涉及代码中的变量值。

静态存储区:用来存放全局变量和静态变量。

栈区:存放函数内的局部变量,形参和函数返回值。栈区之中的数据的作用范围过了之后,系统就会回收自动管理栈区的内存(分配内存 , 回收内存),不需要开发人员来手动管理。

堆区:也称为动态存储区。这块区域的内存供c语言程序动态申请。通俗地讲,也就是我们用malloc族函数申请并用free族函数释放的内存。

常量区:存放常量(程序在运行的期间不能够被改变的量,例如: 10,字符串常量”abcde”, 数组的名字等)

堆栈详解

栈:后进先出性质的数据结构,也就是说后存放的先取,先存放的后取。这就如同我们要取出放在箱子里面底下的东西(放入的比较早的物体),我们首先要移开压在它上面的物体(放入的比较晚的物体)。

堆:像一棵倒过来的树,堆是一种经过排序的树形数据结构,每个结点都有一个值。通常我们所说的堆的数据结构,是指二叉堆。堆的特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆。由于堆的这个特性,常用来实现优先队列,堆的存取是随意,这就如同我们在图书馆的书架上取书,虽然书的摆放是有顺序的,但是我们想取任意一本时不必像栈一样,先取出前面所有的书,书架这种机制不同于箱子,我们可以直接取出我们想要的书。

要点:
栈:由系统自动分配,速度较快。但程序员是无法控制的。
堆:是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便。(程序员自己分配的,new,malloc)

int a = 0; 全局初始化区
char *p1; 全局未初始化区
main()
{
int b;char s[] = "abc";char *p2;char *p3 = "123456"; 123456\0在常量区,p3在栈上。
static int c =0; 全局(静态)初始化区
p1 = (char *)malloc(10);  堆
p2 = (char *)malloc(20);}
效率问题
char s1[] = "aaaaaaaaaaaaaaa";
char *s2 = "bbbbbbbbbbbbbbbbb";
aaaaaaaaaaa是在运行时刻赋值的;放在栈中。
而bbbbbbbbbbb是在编译时就确定的;放在常量区。
在以后的存取中,在栈上的数组比指针所指向的字符串(例如堆)快。

堆栈的优缺点简要

使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。
.
使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比符合自己的口味,而且自由度大。

局部变量、static与全局变量详解

static作用
1、static声明函数
只能被模块内的函数调用,不能被模块外的函数调用。模块可以理解为当前.c文件。
2、static声明全局变量
只能在当前.c文件中使用。
3、static声明局部变量
只能用作当前函数体。
注意!!!static变量可以默认初始化,默认值为0或者"/0"
内存问题

\ 存储位置 生命周期 作用范围
static全局变量 静态数据区 整个程序运行期间 当前.c文件
全局变量 静态数据区 整个程序运行期间 整个源程序
static局部变量 静态数据区 整个程序运行期间 当前函数体
局部变量 函数执行完即被释放 当前函数体

参考博客:https://blog.csdn.net/ai616818/article/details/6773462

https://blog.csdn.net/weixin_42362146/article/details/113054791

你可能感兴趣的:(C语言编程,堆栈,数据结构)