动态内存分配

我们要想实现动态内存分配,就需要学习标准C提供的函数库:
1. 函数所属的库文件
2. 函数的原型-函数的声明
1. 函数名
2. 形参
3. 返回值类型
3. 函数的功能
注意:内存分配函数在申请内存时,建议用多少申请多少,可以有少量的预留量;但不能越界访问
(虽然编译和运行不报错,但数据不安全)

常用函数

malloc
头文件: #include <stdlib.h>
函数功能:C 库函数 void *malloc(size_t size) 分配所需的内存空间,并返回一个指向它的指
针。
函数原型:

        函数名:malloc
        形式参数:size_t size:内存块的大小,以字节为单位。本质上就是一个 unsigned int
        返回值类型:void* :该函数返回一个指针,指向已分配大小的内存,如果请求失败,返回
NULL。

说明:

        1. malloc函数分配的内存没有默认值,是不确定数,大概率是0;

        2. malloc函数申请的内存空间连续。

calloc

头文件: #include <stdlib.h>
函数功能:C库函数 void * calloc(size_t nitems,size_t size) 分配所需的内存空间,并返回一
个指向它的指针。
malloc和calloc之间不同点事,malloc不会设置内存为零,而calloc会设置内存为零。
函数原型: void *calloc(size_t nitems,size_t size)
函数名:calloc
形式参数:
size_t nitems:申请多少个
size_t size:一个占几个内存单元(一个内存单元 等于 一个字节)
返回值类型:void*:该函数返回一个指针,指向已分配大小的内存。如果请求失败,返回
NULL。

举例:

        int *p = (int*)calloc(3,4); // p指向的空间的大小是12个字节

        if(!p) printf("内存申请失败!\n");

说明:

        1. calloc函数分配的内存有默认值,每个内存单元都是0

        2. calloc函数申请的内存空间连续

        3. calloc大多时候为数组中的元素申请内存 转存栈中数组中的数据:
 

int arr[3] = {10,20,30}; // 在栈区
int *p = (int*)calloc(3,4); // 申请内存,在堆区
if(!p) puts("内存申请失败!");
// 转存
for(int i = 0;i < 3; i++)
p[i] = arr[i];
// 遍历
for(int i = 0;i < 3; i++)
printf("%d,",p[i]);
printf("\n");
// p使用完,记得释放内存
free(p);
p = NULL; // 内存回收后,建议置空

realloc

头文件: #include <stdlib.h>
函数功能:尝试重新调整之前调用malloc或calloc所分配的ptr所指向的内存块的大小。
函数原型: void *realloc(void *ptr,size_t size)

函数名:realloc
形式参数:
void *ptr:是malloc或者calloc的返回值
size_t size:重新分配后的内存大小
返回值:void*:该函数返回一个指针,指向已分配大小的内存。如果请求失败,返回NULL。
案例:
        int *p = (int*)malloc(4);
        int *w = (int*)realloc(p,20);
        // int *q = (int*)realloc(p,0); // 等效于free(p)

说明:
1. realloc以原来malloc返回的内存地址开始,分配总共20个字节的内存空间
2. 如果原来的内存空间后有20个连续空间,就扩容20-4 =16个内存单元,返回原来旧的内存首地
址。
3. 如果原来的内存空间后不够20个连续内存空间,就重新找一个内存地址开始,申请20个内存
单元。并将原来的数据拷贝到新的内存中,回收旧的内存单元,并返回新的内存首地址。

free

头文件: #include <stdlib.h>
函数功能:释放之前调用 malloc、calloc、realloc所分配的内存空间,是访问完记得使用NULL置
空。
函数原型: void free(void *ptr)
函数名:free
形式参数:
void *ptr:calloc,malloc.realloc的返回值
返回值类型:void:没有返回值
注意:
1. 堆内存中的指针才需要回收,栈中系统会自动回收
2. 堆内存不能重复回收,运行会报错
说明:
1. 堆的内存空间相比较栈要大很多
2. 内存分配函数返回的指针变量可以参与运算(只读),但不能被修改(p++或者p+=i 是错误的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值