🌸栈和堆


:栈是一种线性结构,堆是一种树形结构。
:栈是由编译器在需要时分配的、不需要时自动清除的变量存储区。栈的内存分配和释放由系统自动管理,不需要程序员手动控制。堆是由程序员手动分配和释放的内存块,通常使用malloc()或new操作符来动态分配内存。
:栈中存储的一般是函数参数、函数调用和局部变量等。堆主要用于存储对象实例和数组。
:分配和释放内存的操作非常高效。
:栈的大小有限,不能动态扩展。
:可以动态扩展,分配的内存空间较大,存储自由。
:需要手动进行内存管理,如果没有及时释放分配的内存,会导致内存泄漏或内存溢出的问题。

🌸静态内存的缺陷


①在定义时,数组的大小必须是事先知道的。比如int arr[100];,并且在一般情况下,为了解决实际问题,保证数组的大小足够用,可以存储足够的变量,我们一般都会将数组的长度定义的足够长。在这样的情况下,一般就存在内存浪费的问题。
②数组存储在栈区。在程序运行期间,一个函数中定义的数组只能在该函数运行期间被其他函数调用。函数运行结束后由系统自动释放内存空间。而动态内存空间就不存在这样的问题,动态内存空间是由程序员手动分配的内存块。只要程序员不释放该内存空间,就算函数运行结束,该内存空间也不会被释放。只有当程序运行结束,这时系统为该程序分配的所有内存空间都会被释放。

🌸malloc函数的使用


malloc函数的原型:

void* malloc (size_t size);

头文件:

#include <stdlib.h>

该函数的功能是在内存的动态存储空间即中分配一个长度为size的连续空间
函数的返回值: 一个指向所分配内存空间 的指针,类型为**void ***型。

malloc函数的返回值是一个地址,这个地址就是动态分配的内存空间起始地址。如果此函数未能成功地执行,如内存空间不足,则返回空指针NULL

🌸易混淆:静态内存与静态变量

静态变量:一般是由static关键字修饰。静态变量与全局变量一样都是在静态存储区中存储的。
静态内存:静态内存是在栈中分配的,比如局部变量。

🌸malloc动态分配内存


我们一般用malloc函数进行区分。动态分配内存都有一个标志,即使用malloc函数进行区分。

int *p=(int*)malloc(4);

它的意思是:
请求操作系统分配4个字节的内存空间,并返回动态内存的第一个字节的地址。使用强制转换(int*),将malloc函数的返回值强制转换成int *型。将此int 型指针赋值给p

这里需要注意的是:
指针变量p是在静态内存存储的。 指针变量p是用传统的方式定义的,所以是静态分配的内存空间。

09-15 17:32