news 2026/10/3 7:20:02

【动态内存管理】c语言

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【动态内存管理】c语言

动态内存管理

目录:

  1. 动态内存分配
  2. malloc
  3. free
  4. calloc
  5. realloc
    === =========================================

1.动态内存分配

动态内存分配的价值体现在进行时灵活性
常见的内存分配是在程序编译时确定的

inta=10;intarr[]={1,2,3};

这样的定义,内存大小都是固定的,而且数组一旦确定便不能再调整,而有的时候我们所需要的内存大小是不确定的,这时我们可以通过一些函数来解决我们的问题

2.malloc

#include<stdlib.h>此时我们需要引入这个头文件

void*malloc(size_tsize);

功能:向内存的堆区申请一块连续的空间,并返回指向这块空间的起始地址。

  • 如果开辟成功,则返回起始地址
  • 如果开辟失败,则返回NULL,因此一定要检查,如果要开辟的内存过大,可能超出计算机所能承受的范围此时就开辟失败了
  • 返回值的类型为void*,所以malloc函数并不知道开辟空间的类型,可自行决定
  • 如果参数size为0,malloc的行为是标准未定义的,取决于编译器。
#include<stdio.h>#include<stdlib.h>intmain(){intn=5;int*ptr=(int*)malloc(n*sizeof(int));//可以直接写数字if(ptr!=NULL){for(inti=0;i<n;i++){*ptr(i+i)=i;}for(inti=0;i<n;i++){printf("%d",*(ptr+i));}}return0;}

我们通过强制类型转换,将malloc的返回类型转为int*
3.free

voidfree(void*ptr);

free函数用来释放动态开辟的内存。

  • 如果参数ptr指向的空间不是动态开辟的,那free函数的行为是未定义的。
  • 如果参数ptr是NULL指针,则函数什么事都不做。
#include<stdio.h>#include<stdlib.h>intmain(){intn=5;int*ptr=(int*)malloc(n*sizeof(int));if(ptr!=NULL){for(inti=0;i<n;i++){*(ptr+i)=i+1;}for(inti=0;i<n;i++){printf("%d",*(ptr+i));}}free(ptr);ptr=NULL;return0;}

为什么要将ptr置为空指针,free只释放内存,不改变指针自身,如果不将ptr置为空指针,那么它就变成了野指针,

4.calloc

void*calloc(size_tnum,size_tsize);

函数的功能是num个大小为size的元素开辟一块空间,并且把空间的每个字节初始化为0.
与函数malloc的区别只在于calloc会在返回地址之前把申请的空间的每个字节初始化为全0

#include<stdio.h>#include<stdlib.h>intmain(){intn=5;int*ptr=(int*)calloc(n,sizeof(int));if(ptr!=NULL){for(inti=0;i<n;i++){printf("%d",*(ptr+i));}}free(ptr);ptr=NULL;return0;

5.realloc

realloc的功能:让动态内存管理更加灵活。
有时我们会发现过去申请的空间太小了,有时又太大了,此时可以通过realloc来进行调整

void*realloc(void*ptr,size_tsize);
  • ptr是要调整的内存地址
  • size调整之后新大小,单位是字节
  • 返回值为调整后的起始位置**【如果后边的内存够用就延用后边的内存,如果不够那么就开辟一块新的堆】
  • 这个函数调整原内存空间大小的基础上,还会将原来内存的数据移动到新的空间。

#include<stdio.h>intmain(){intn=5;int*ptr=(int*)malloc(n*sizeof(int));if(ptr!=NULL){for(inti=0;i<n;i++){*(ptr+i)=i+1;}for(inti=0;i<n;i++){printf("%d",*(ptr+i));}}printf("\n");int*p=NULL;p=realloc(ptr,n*sizeof(int));if(p!=NULL){ptr=p;for(inti=0;i<2*n;i++){printf("%d",*(ptr+i));}}free(ptr);ptr=NULL;return0;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/3 7:19:59

Agent的自旋检测与优雅退场

Agent 的自旋检测与优雅退场&#xff1a;什么时候该坚持&#xff0c;什么时候该停&#xff1f; 报错"连接拒绝"&#xff0c;你的 Agent 第 1 次改了端口&#xff0c;第 2 次换了命令&#xff0c;第 3 次建议你"检查防火墙"&#xff0c;第 4 次……把第 1 次…

作者头像 李华
网站建设 2026/10/3 7:19:43

论文降重和降AI能一起做的工具:26届实测盘点

论文查重刚过&#xff0c;导师又发来一条消息&#xff1a;“AI检测标红了&#xff0c;自己改一下。”打开检测报告&#xff0c;满屏飘红&#xff0c;整个人坐在电脑前半天没动。这不是个例。今年毕业论文季&#xff0c;不少同学卡在了同一道坎上——降重和降AI&#xff0c;两件…

作者头像 李华
网站建设 2026/10/3 7:18:15

分化标志物抗体定制:如何精准锚定细胞命运的转变轨迹?

细胞分化是一个涉及多重分子事件有序调控的动态过程&#xff0c;精准识别各阶段的特异性标志物是解析其机制的核心。本文系统分析了分化研究对高特异性抗体的内在需求、传统商业化抗体的应用局限&#xff0c;并深入阐述了定制化抗体开发中从靶点评估、抗原设计到应用验证的全流…

作者头像 李华
网站建设 2026/10/3 7:17:43

普及组集训【模拟二】——补题报告

题目分数第一题&#xff1a;100第二题&#xff1a;100第三题&#xff1a;60&#xff08;加一个一就过了&#xff09;第四题&#xff1a;85总分&#xff1a;345考试过程第一题5分钟写完&#xff0c;调bug的时间有点长&#xff0c;本题大约用了15分钟&#xff0c;第二题本人感觉有…

作者头像 李华