当前位置: 首页 > news >正文

C语言--动态内存【详细解释】


一.动态内存介绍🍗

在C语言中,动态内存分配是指在程序运行时根据需要动态申请内存空间,以便在程序的不同阶段存储和使用数据。动态内存的分配与释放需要一组函数来实现,包括malloc、calloc、realloc和free。

  1. malloc: 函数用于分配指定大小的内存块,并返回指向该内存块起始地址的指针。语法为:void *malloc(size_t size);

  2. calloc: 函数用于分配指定数量和大小的内存块,并将内存块中的每个字节初始化为0。语法为:void *calloc(size_t num, size_t size);

  3. realloc: 函数用于重新分配已经分配的内存块的大小,可以增大或减小内存块的大小。语法为:void *realloc(void *ptr, size_t size);

  4. free: 函数用于释放通过malloc、calloc或realloc函数分配的内存块,以便将其归还给系统。语法为:void free(void *ptr);

动态内存分配区域:堆(heap),很大接近可用内存,内存申请和销毁需要程序自行管理 
内存什么情况还给系统: 1.程序(进程)退出 2.关机(重启) 
局部变量:定义在函数内部的变量,包括形参,在栈(stack)中,作用域在函数内部有效,
生存周期:进入函数 创建,退出函数销毁
void :没有,可以修饰返回值或参数列表 void *:通用指针,仅仅只标记地址,不包含类型信息 
应用场景: 
1.需要根据变量作为长度定义数组 
2.函数结束后还需要继续使用的内存(例如返回局部数组的地址,链表)
3.长度较大的数组(大内存,超过栈1M的大小)

二.malloc函数的用法🍗

1.需要根据变量作为长度定义数组

2.函数结束后还需要继续使用的内存(例如返回局部数组的地址,链表)

正确的写法


3.长度较大的数组(大内存,超过栈1M的大小)


二.calloc函数的用法🍗

calloc会把动态申请的内存每个单元初始化为0.


三.free崩溃的原因🍗

1.越界
2.移动指针 
3.重复释放或者释放非动态内存
#include<stdio.h>
#include<stdlib.h>
//1.越界
int main()
{int n = 10;int* arr = (int*)malloc(n);assert(arr != NULL);for (int i = 0; i < n; i++)arr[i] = i;for (int i = 0; i < n; i++)printf("%d ", arr[i]);printf("\n");free(arr);return 0;
}//2.移动指针
int main()
{int n = 10;int* arr = (int*)malloc(n * sizeof(int));assert(arr != NULL);for (int i = 0; i < n; i++){//arr[i] = i;*arr = i;arr++;}printf("\n");free(arr);return 0;
}//重复释放同一段内存
int main()
{int n = 10;int* arr = (int*)malloc(n * sizeof(int));assert(arr != NULL);for (int i = 0; i < n; i++){arr[i] = i;}printf("%p\n", arr);free(arr);printf("%p\n", arr);//arr是野指针free(NULL);//可以//free(arr);//崩溃,重复释放return 0;
}

如果对您有帮助的话,给小编一个免费的赞以表鼓励吧🍗
http://www.lryc.cn/news/258961.html

相关文章:

  • 施工现场安全管理系统
  • 电线电缆行业生产管理MES系统解决方案
  • 滑动窗口最大值和前K个高频元素
  • C语言实现在顺序表中找到最大值
  • 数字工厂管理系统建设层级分为哪几层
  • MySQL 8 update语句更新数据表里边的数据
  • 可视化监控云平台/智能监控平台EasyCVR国标设备开启音频没有声音是什么原因?
  • L1-039:古风排版
  • 树莓派新手装机指南
  • flink使用事件时间时警惕kafka不同分区的事件时间倾斜问题
  • 『App自动化测试之Appium基础篇』| Desired Capabilities详解与使用
  • vscode插件webview和插件通信
  • 【STM32单片机】贪吃蛇游戏设计
  • 【Java 基础】32 定时调度
  • C++ 教程 - 02 复合数据类型
  • 【数据处理】NumPy数组的合并操作,如何将numpy数组进行合并?
  • JavaScript实现飘窗功能
  • Docker笔记:容器转换成镜像,导出导入镜像,数据拷贝,查看日志
  • 串行计时芯片D1380/D1381,2.0V~5.5V 工作电流: 2V时 与TTL 兼容,采用DIP8、SOP8封装
  • 中间件系列 - Redis入门到实战(基础篇)
  • 项目经理和产品经理该如何选择?
  • java WebSocket带参数处理使用
  • OkHttp: 拦截器和事件监听器
  • 总结一些vue3小知识2
  • 【Excel设置动态图表】
  • 用 C 写一个卷积神经网络
  • 直面双碳目标,优维科技携手奥意建筑打造绿色低碳建筑数智云平台
  • docker 基础入门
  • HarmonyOS:NativeWindow 开发指导
  • 汉威科技传感器为农业加点“智慧”