C语言动态分配内存的函数
今天在学习中碰见了动态分配内存有关的函数:malloc realloc calloc free。以下是详细的记录
"动态内存":在程序运行期间,动态分配内存空间,一般是在"堆,heap"空间上分配。
malloc: memory allocate 内存分配
realloc: repeat allocate 再分配——重新分配:一次内存分配完成之后,后面用的时候,发现不够用,再分配。
calloc: clear allocate 分配内存时同时清 0
free :释放
动态分配的内存,需要在你不用的时候,需要手动释放free,否则这个空间一直时你的。
动态内存分配:如果分配了空间,就一直存在,直到你手动free或者进程结束。
有时候,把动态分配的内存“匿名内存”,“匿名内存”只能通过他的指针去访问。
一、malloc 内存分配
#include<stdlib.h>//malloc的头文件
malloc向系统申请一段连续的大小为size字节的空间,并且把内存的首地址返回(void*)
void* malloc(size_t size);
size: 你要分配多大的空间,单位是字节,要分配多大,就输入。
返回值:
内存开辟成功,返回开辟空间的首地址(void*)通用指针类型
不成功,返回NULL
//用malloc写一个动态数组
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n;
printf("请输入你要的数组大小:\n");
scanf("%d",&n);
int *p = (int*)malloc(n*sizeof(int));
for(int i=0;i<n;i++)
{
scanf("%d",p+i);
}
for(int j=0;j<n;j++)
{
printf("%d ",p[j]);
}
}
二、relloc内存再分配
#include <stdlib.h>
realloc 用来把ptr(malloc/calloc/realloc返回的地址,或者是NULL)
指向的空间,扩大到size大小
void *realloc(void *ptr, size_t size);
1.
ptr == NULL,首次分配
realloc(NULL,size) <==> malloc(size)
ptr != NULL
<1> size > 原来的大小
"扩建"
realloc用来把ptr指向的内存,扩大到size大小
原来的内存内容保持不变,后面新增的内存不会初始化.
他只负责分配空间.
(1)原址扩建
(2)整体搬迁
2.
size == 0
realloc(ptr,0) <==> free(ptr)
size < 原来的大小
这种情况,作者没有考虑到这种行为,这种行为是未定义的(什么结果都有可能发生)
//以下是用realloc将内存扩建
#include<stdio.h>
#include<stdlib.h>
int main()
{
int* p=(int*)malloc(10*sizeof(int));用malloc函数开辟了一段4*10的字节大小空间,首地址保存在p中。
p=(int*)realloc(p,80);//用realloc函数将原本的malloc开辟的空间扩容到了4*20字节大小空间,首地址还保存在p中。
return 0;
}
三、calloc分配内存后 同时清零
#include <stdlib.h>
calloc 也是用来从"堆空间" 分配内存的,只不过calloc分配的内存会自动清0
void *calloc(size_t n, size_t size);
n : 要分配多少个元素
size : 每个元素占多少个字节
calloc 分配的总字节大小为 : n*size
返回值 :
成功 返回分配到的空间的首地址
失败 返回NULL
//用calloc开辟一段空间且置零
#include<stdio.h>
#include<stdlib.h>
int main()
{
int* p=(int*)calloc(10,sizeof(int));//分配了10个元素,每个元素占用了4个字节,且全部置零。
//打印验证
for(int i=0;i<10;i++)
{
printf("%d ",*(p+i));
}
return 0;
}
四、free 释放分配的空间的
#include <stdlib.h>
free用来释放动态分配的空间的.
void free(void *ptr);
ptr : 要释放的空间的首地址,这个地址要是 malloc/calloc/realloc的返回值,其他地址
返回值 :
无
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)