首页 > 系统相关 >【C语言知识碎片】动态内存分配函数的使用

【C语言知识碎片】动态内存分配函数的使用

时间:2022-10-18 12:06:04浏览次数:42  
标签:10 arr NULL int realloc malloc 碎片 动态内存 C语言

1.为什么需要动态内存分配

我们需要存储一些数据时可以创建一个变量或者数组来进行存储。

int val=10;
int arr[10]={0};

数组在开辟好之后大小是不能变的,但是这种静态的内存在实际使用时却无法满足我们的需要,比如此时我们需要存储1~2000个数据,我可能存10个也可能存2000个

那么我们该如何来创建数组的大小呢,创建一个arr[2000]如果我只存放了10个数就造成了内存的浪费但是如果我创建一个arr[10]显然很有可能不够。

这时候就需要用到了动态内存分配

1.malloc与free

头文件stdlib.h

#include <stdlib.h>
int main()
{
int* arr = NULL;
int sz = 10;
arr = malloc(sizeof(int) * sz);
if (arr == NULL)
exit(-1);
arr[1] = 4;
arr[2] = 2;
free(arr);
arr = NULL;
}

【C语言知识碎片】动态内存分配函数的使用_数据

可以看到我们已经成功开辟了一个10个int大小的空间

malloc开辟内存失败时会返回一个空指针,所以我们在开辟之后要判断一下空间是否开辟成功。

malloc开辟的空间不会自动回收需要我们手动释放,或者在程序结束后由操作系统自动回收。

如果我们在使用过后忘记回收就会造成C语言中非常严重的一个问题内存泄露

可以看一下下面这段程序

运行前

【C语言知识碎片】动态内存分配函数的使用_malloc_02

运行后

【C语言知识碎片】动态内存分配函数的使用_数组_03

直到我们关闭程序内存的使用才回到运行前的水平所以在使用过后一定要free否则在运行过程中你会就可能出现内存占用量莫名飙升的情况。

2.realloc

头文件stdlib

#include <stdio.h>
#include <stdlib.h>
int main()
{
int* arr = NULL;
int sz = 10;
arr = malloc(sizeof(int) * sz);
if (arr == NULL)
exit(-1);
int* tem=realloc(arr, sizeof(int)*20);
if (tem != NULL)
arr=tem;
free(arr);
return 0;
}

realloc需要传递两个参数一个是需要扩容的空间的指针,2是扩容之后的大小

如果扩容失败realloc会返回一个空指针.

realloc在扩容时如果扩容空间足够大会在后面直接扩容,然后返回arr首地址的指针

【C语言知识碎片】动态内存分配函数的使用_数组_04

而如果空间不足则会另外开辟一片空间,再将arr拷贝过去返回新的地址

【C语言知识碎片】动态内存分配函数的使用_数组_05

【C语言知识碎片】动态内存分配函数的使用_数据_06

标签:10,arr,NULL,int,realloc,malloc,碎片,动态内存,C语言
From: https://blog.51cto.com/u_15572441/5765699

相关文章