引言
- 首先你只需搞明白下面三个函数在哪用,怎么用即可!
- 其他的不用操心了!
- !!注意使用前要调用:"stdlib.h"头文件!!
一、malloc | free
1.使用方法
¥¥ malloc
C语⾔提供了⼀个动态内存开辟的函数:
void malloc (size_t size);*
这个函数向内存申请⼀块连续可⽤的空间,并返回指向这块空间的指针。
• 如果开辟成功,则返回⼀个指向开辟好空间的指针。
• 如果开辟失败,则返回⼀个返回值的类型是NULL 指针,因此malloc的返回值⼀定要做检查。
• 返回值的类型是void* ,所以malloc函数并不知道开辟空间的类型,具体在使⽤的时候使⽤者⾃⼰来决定。(可能要强转)
• 如果参数size 为0,malloc的⾏为是标准是未定义的,取决于编译器。
¥¥ free
C语⾔提供了另外⼀个函数free,专⻔是⽤来做动态内存的释放和回收的,函数原型如下:
void free (void ptr);*
free函数⽤来释放动态开辟的内存。
• 如果参数ptr 指向的空间不是动态开辟的,那free函数的⾏为是未定义的。
• 如果参数ptr是NULL指针,则函数什么事都不做。
malloc和free都声明在stdlib.h 头⽂件中。
2.举个栗子
#include <stdio.h>
#include <stdlib.h>
int main()
{
int num = 0;
// 处理输入验证
if (scanf("%d", &num) != 1 || num < 0) {
fprintf(stderr, "错误:输入必须为非负整数\n");
return 1;
}
// 使用 calloc 自动初始化内存为零
int* ptr = (int*)calloc(num, sizeof(int));
if (ptr == NULL && num != 0) { // 处理 num=0 的特殊情况
fprintf(stderr, "错误:内存分配失败\n");
return 1;
}
// (此处可添加其他数组操作代码)
free(ptr); // free(NULL) 是安全的
ptr = NULL; // 消除野指针
return 0;
}
二、calloc
后面写
三、realloc
void* realloc (void* ptr, size_t size);
1.使用方法
• ptr 是要调整的内存地址
• size 调整之后新⼤⼩
• 返回值为调整之后的内存起始位置。
• 这个函数调整原内存空间⼤⼩的基础上,还会将原来内存中的数据移动到新的空间。
• realloc在调整内存空间的是存在两种情况:
◦ 情况1:原有空间之后有⾜够⼤的空间
◦ 情况2:原有空间之后没有⾜够⼤的空间
2.误区
- p - > arr 表示的是一个指针哦!
在下面代码中,ps 是一个结构体(例如顺序表 SeqList),其成员 arr 通常是如下定义的:
typedef struct {
SLDataType* arr; // 动态数组的指针(一个大的快递柜的快递单号)
//类比:找到了一个顺丰快递柜的地址单号
int size; // 当前元素数量(SF快递柜里存放的快递数量)
int capacity; // 当前容量(快递柜的总柜子数量)
} SeqList;
3.代码演示
// 1. 用临时变量接收新地址
SLDataType* tmp = realloc(ps->arr, newCapacity * sizeof(SLDataType));
// 2. 检查是否分配成功
if (tmp == NULL) {
// 处理失败:保留原内存,避免覆盖
free(ps->arr); // 释放旧内存(会有野狗指针!)
ps->arr = NULL; // 置空拴住野狗子
return ERROR_CODE; // 检测
}
// 3. 更新指针和容量字段
ps->arr = tmp;
ps->capacity = newCapacity; // 更新容量
总结
你小学生学会还是可以的!我的目的就是教你像是玩MC一样轻轻松松,愉快的变强~
即使成长的路上,总有一些我们感到困难的游戏关卡和时候,那证明着我们正在走上坡路~