C语言-内存分配
内存分配
1. 引入
int nums[10] = {0}; //对int len = 10;
int nums[len] = {0}; //错是因为系统的内存分配原则导致的
2. 概述
在程序运行时,系统为了 更好的管理进程中的内存,所以有了 内存分配机制。
分配原则:
2.1 静态分配
静态分配原则:
特点:
1、在程序编译过程中,按事先规定的大小 分配内存空间的分配方式;
2、必须事先知道所需空间的大小;
3、分配在 栈区或全局变量区,一般 以数组的形式;
4、按计划分配。
2.2 动态分配
特点:
1、在程序运行过程中,根据需要大小自由分配所需空间;
2、按需分配;
3、分配在堆区,一般 使用特定的函数进行分配。
案例:
需求:1、班级有15个学员,定义数组记录学员成绩double score[15] = {0};2、记录学员成绩- 输入学员数量- 在堆区申请- 扩展- 释放
注意:
在c语言中提供了一系列动态分配内存的函数
这些函数大部分都在stdlib.h头文件中声明free 释放
malloc 申请空间,默认值随机
calloc 申请空间,默认值为0
realloc 扩展空间string.h中提供的函数
memset 将malloc中的随机数设为0
3. 动态分配函数
3.1 memset 函数
作用:重置
语法:
#include <string.h>void *memset(void *s, int c, size_t n);参数:s: 开始的位置c: 重置后的数据n: 重置的数量从s开始, 将n个字节的数据, 设置为c
示例:
#include <stdio.h>
#include <string.h>
int main(int argc, char const *argv[])
{char str[10] = {0};memset(str, 'a', 10);for (char i = 0; i < 10; i++){printf("%c ", str[i]);}printf("\n");// a a a a a a a a a a int nums[5] = {1,2,3,4,5};memset(nums, 0, 20);for (int i = 0; i < 5; i++){printf("%d ", nums[i]);}printf("\n");//0 0 0 0 0 return 0;
}
3.2 free 函数
作用:释放内存
语法:
#include <stdlib.h>void free(void *ptr);参数:ptr: 指针
注意:
ptr 指向的内存必须是
malloc、calloc、relloc动态申请的内存
3.3 malloc 函数
作用:在堆内存中开辟空间
语法:
void *malloc(size_t size)参数:size_t: 可以理解为无符号int;size: 开辟空间大小,单位字节。返回值:开辟的空间的地址开辟失败返回NULL
注意:
- 在使用malloc时,需要 判断是否开辟成功;
- 如果多次 malloc 申请的内存,第 1 次和第 2 次申请的内存不一定是连续的;
malloc的返回值在使用中 记得 强制类型转换 (因为该函数原型返回 void*指针 );- malloc从堆区申请空间后 空间的内容中的值是
随机的(与局部变量一样大概率为0),可以使用memset函数对空间中的数据进行置0。
示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char const *argv[])
{//1、申请空间//申请一个可以存储10个int数据的空间int *nums = (int *)malloc(10 * sizeof(int));//2、判断是否开辟失败if(nums == NULL){printf("内存开辟失败\n");return 0;}//置0memset(nums, 0, 10*sizeof(int));//3、使用空间for (int i = 0; i < 10; i++){printf("请输入第%d个数\n", i+1);scanf("%d", &nums[i]);}for (int i = 0; i < 10; i++){printf("%d ", nums[i]);}printf("\n");//4、释放空间free(nums);return 0;
}
3.4 calloc 函数
作用:在堆内存中开辟空间
语法:
void *calloc(size_t nmemb, size_t size);参数:nmemb: 申请的块数size: 每块的大小返回值:开辟的空间的地址开辟失败返回NULLint *p = malloc(10 * sizeof(int));
int *p = calloc(10, sizeof(int));
示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char const *argv[])
{//1、申请空间//申请一个可以存储10个int数据的空间// int *nums = (int *)malloc(10 * sizeof(int));int *nums = (int *)calloc(10, sizeof(int));//2、判断是否开辟失败if(nums == NULL){printf("内存开辟失败\n");return 0;}//3、使用空间for (int i = 0; i < 10; i++){printf("请输入第%d个数\n", i+1);scanf("%d", &nums[i]);}for (int i = 0; i < 10; i++){printf("%d ", nums[i]);}printf("\n");//4、释放空间free(nums);return 0;
}
3.5 realloc 函数
作用:扩展空间,其实是重新申请内存
语法:
void *realloc(void *ptr, size_t size);参数:ptr:原指针size:从新开辟的大小,原大小+新开的大小返回值:开辟成功返回新地址开辟失败返回NULL
注意:
新地址不一定等于原地址,但是大概率相同
在原先 ptr 指向的内存基础上
重新申请内存,新的内存的大小为 size 个字节,如果原先内存后面有足够大的空间,就追加,如果后边的内存不够用,则 relloc 函数会在堆区找一个 size 个字节大小的内存申请,将原先内存中的内容拷贝过来,然后释放原先的内存,最后返回新内存的地址。
示例:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{char * strs = (char *)calloc(3, sizeof(char));strs = realloc(strs, 2*sizeof(char));for (int i = 0; i < 5; i++){scanf("%s", &strs[i]);}for (int i = 0; i < 5; i++){printf("%c ", strs[i]);}printf("\n");free(strs);return 0;
}
4. 内存泄漏
4.1 概念
申请的内存,首地址丢了,找不了,再也没法使用了,也没法释放了,这块内存就被泄露了。
4.2 记录申请内存的指针变量指向别的地方
int *p = (int *)malloc(40);
int nums[10] = {};
p = nums; //p 指向别的地方了
//从此以后,再也找不到申请的 40 个字节了。 则动态申请的 40 个字节就被泄露了
4.3 在函数中申请空间,使用完毕没有释放
void test()
{int *p = (int *)malloc(40);
}
test(); //每调用一次 test 泄露 40 个字节
5. 防止多次释放
多次释放示例:
int *p = (int *)malloc(40);
free(p);
free(p);//注意多次释放会报错
防止多次释放:
释放前判断,释放后置NULL
示例:
int *p = (int *)malloc(40);
if(p != NULL)
{free(p);p = NULL;
}
if(p != NULL)
{free(p);p = NULL;
}
6. 练习
设计函数,接收一个字符串,返回这个字符串的逆向内容
#include <stdio.h>
#include <stdlib.h>int my_strlen(char *str)
{int len = 0;while (*str != '\0'){str++;len++;}return len;
}char * my_strrev(char *str)
{int len = my_strlen(str);char *new_str = (char *)calloc((len+1), sizeof(char));for (int i = 0; i < len; i++){new_str[i] = str[len-i-1];}new_str[len] = '\0';return new_str;
}int main(int argc, char const *argv[])
{char *str = "helloworld";char *new_str = my_strrev(str);printf("%s\n", new_str);if (new_str != NULL){free(new_str);new_str = NULL;}return 0;
}
// dlrowolleh
相关文章:
C语言-内存分配
内存分配 1. 引入 int nums[10] {0}; //对int len 10; int nums[len] {0}; //错是因为系统的内存分配原则导致的2. 概述 在程序运行时,系统为了 更好的管理进程中的内存,所以有了 内存分配机制。 分配原则: 2.1 静态分配 静态分配原…...
算法工程师-机器学习面试题总结(1)
目录 1-1 损失函数是什么,如何定义合理的损失函数? 1-2 回归模型和分类模型常用损失函数有哪些?各有什么优缺点 1-3 什么是结构误差和经验误差?训练模型的时候如何判断已经达到最优? 1-4 模型的“泛化”能力是指&a…...
【蓝桥杯选拔赛真题73】Scratch烟花特效 少儿编程scratch图形化编程 蓝桥杯创意编程选拔赛真题解析
目录 scratch烟花特效 一、题目要求 编程实现 二、案例分析 1、角色分析...
Juniper EX系列交换机端口配置操作
配置物理端口参数 userhost#set interface ge-slot/pic/port decription description #配置端口描述 userhost#set interface ge-slot/pic/port mtu mtu-number #配置端口MTU userhost#set interface ge-slot/pic/port ether-options speed (10m | 100m | 1g) #配置端口速率…...
2.1 Linux C 编程
一、Hello World 1、在用户根目录下创建一个C_Program,并在这里面创建3.1文件夹来保存Hellow World程序; 2、安装最新版nvim ①sudo apt-get install ninja-build gettext cmake unzip curl ②sudo apt install lua5.1 ③git clone https://github.…...
服务器数据恢复—ocfs2文件系统被格式化为其他文件系统如何恢复数据?
服务器故障: 由于工作人员的误操作,将Ext4文件系统误装入到存储中Ocfs2文件系统数据卷上,导致原Ocfs2文件系统被格式化为Ext4文件系统。 由于Ext4文件系统每隔几百兆就会写入文件系统的原始信息,原Ocfs2文件系统数据会遭受一定程度…...
海云安参与制定《信息安全技术 移动互联网应用程序(App)软件开发工具包(SDK)安全要求》标准正式发布
近日,由TC260(全国信息安全标准化技术委员会)归口 ,主管部门为国家标准化管理委员会,深圳海云安网络安全技术有限公司(以下简称“海云安”)等多家相关企事业单位共同参与编制的GB/T 43435-2023《…...
如何调用 API | 学习笔记
开发者学堂课程【阿里云 API 网关使用教程:如何调用 API】学习笔记,与课程紧密联系,让用户快速学习知识。 课程地址:阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台 如何调用 API 调用 API 的三要素 要调用 API 需要三…...
关于云备份项目的HTTP协议字段理解
200状态码 给客户端返回该文件全部内容的响应 304状态码 206状态码 和If-Ranage请求头字段搭配使用,...
掉落的俄罗斯方块
欢迎来到程序小院 掉落的俄罗斯方块 玩法:上键 W↑变换、 左键 A← 左移、右键 D→ 右移、下键S ↓ 加速,两种模式, 可以一个大人玩,也可以两个人一起玩,小鸟经过会撞走方块,快去体验吧^^。开始游戏 html <div idc…...
医院不良事件报告系统源码带鱼骨图分析
医院不良事件上报系统通过 “事前的人员知识培训管理和制度落地促进”、“事中的事件上报和跟进处理”、 以及 “事后的原因分析和工作持续优化”,结合预存上百套已正在使用的模板,帮助医院从对护理事件、药品事件、医疗器械事件、医院感染事件、输血事件…...
数据库相关算法题 V3
订单最多的客户 在考虑多个最多订单客户的情况下可以采用dense_rank()函数,最多则由group by customer_number以及order count(*)得到 select customer_number from (select customer_number,dense_rank() over (order by count(*) desc) as rk from Orders group…...
第二证券:本周3只新股申购,大豆蛋白行业领军企业来了!
截至发稿,本周网上发行有2只新股宣布发行价。创业板新股丰茂股份发行价为31.9元,发行市盈率28.27倍,工作最近一个月平均动态市盈率25.76倍。沪主板新股索宝蛋白发行价为21.29元,发行市盈率26.74倍,工作最近一个月平均动…...
【go语言开发】loglus日志框架的使用
本文将简单介绍loglus框架的基本使用,并给出demo 文章目录 前言Loglus常见用法自定义日志级别使用字段钩子输出到多个位置使用钩子实现自定义日志处理demo 前言 Logrus 是一个用于 Go 语言的结构化日志框架,它提供了丰富的日志级别、钩子和格式化选项。…...
【Unity动画】Unity 动画播放的流程
本文以2D为案例,讲解Unity 播放动画的流程 准备和导入2D动画资源 外部导入序列帧生成的 Unity内部制作的 外部导入的3D动画 2.创建动画过程 打开时间轴Ctrl6 选中场景中的一个未来需要播放动画的物体 回到时间轴点击Create一个新动画片段 拖动2D动画资源放入…...
深度学习——第3章 Python程序设计语言(3.2 Python程序流程控制)
3.2 Python程序流程控制 目录 1.布尔数据类型及相关运算 2.顺序结构 3.选择(分支)结构 4.循环结构 无论是在机器学习还是深度学习中,Python已经成为主导性的编程语言。而且,现在许多主流的深度学习框架,例如PyTorc…...
EasyExcel生成多sheet页的excel
一、controller层 ApiOperation(value "明细查询导出") PostMapping(value "/SummaryDetailExport") public void summaryDetailExport(RequestBody SearchDTO dto, HttpServletResponse response) throws IOException {reportService.deptPackagingSum…...
家用小型洗衣机哪款性价比高?内衣洗衣机品牌推荐
近日,国内著名的电子商务平台公布了“内衣洗衣机产业趋势”的研究报告。该报告指出,由于消费者对生活质量的要求越来越高,内衣洗衣机的行业也有了长足的发展,特别是在今年以来,内衣洗衣机的销售额同比上涨了830%&#…...
为何Go爬虫依然远没有Python爬虫流行
目录 一、Go与Python的比较 1、语言生态 2、易用性 3、库支持 二、Go爬虫的优势 1、性能与并发性 2、跨平台性 3、内存占用 三、Go爬虫的潜力与未来发展 1、社区支持与库完善 2、跨平台移动应用开发 3、大数据处理与实时分析 四、代码示例 五、结论 在当今的互联…...
【华为OD题库-057】MELON的难题-java
题目 MELON有一堆精美的雨花石(数量为n,重量各异),准备送给S和W。MELON希望送给俩人的雨花石重星一致,请你设计一个程序帮MELON确认是否能将雨花石平均分配。 输入描述 第1行输入为雨花石个数:n,0<n <31. 第2行输入为空格分…...
深度解析:Live2D Widget WebSocket实时交互架构实践
深度解析:Live2D Widget WebSocket实时交互架构实践 【免费下载链接】live2d-widget 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platform 项目地址: https://gitcode.com/gh_mirrors/li/live2d-widget 在当今Web应用追求沉浸式体验的浪潮…...
STM32duino ILPS22QS气压传感器驱动深度解析
1. 项目概述STM32duino ILPS22QS 是一个面向 STM32 平台的 Arduino 兼容库,专为意法半导体(STMicroelectronics)推出的超低功耗数字气压传感器 ILPS22QS 设计。该库并非通用传感器抽象层,而是深度适配 STM32 硬件生态的底层驱动实…...
化学信息学避坑指南:RDKit分子数据解析的7个常见错误与解决方案
RDKit分子数据处理实战:7个高频错误排查与性能优化指南 在药物研发和材料科学领域,RDKit作为化学信息学的瑞士军刀,每天处理着数以百万计的分子结构数据。但当你在凌晨三点调试代码时,一个不起眼的PDB文件编码错误可能让整个分析流…...
Qwen3-0.6B-FP8逻辑推理能力实测:解决经典谜题与数学问题
Qwen3-0.6B-FP8逻辑推理能力实测:解决经典谜题与数学问题 最近在尝试一些轻量级的AI模型,发现Qwen3-0.6B-FP8这个小家伙挺有意思。它体积不大,但官方宣称在逻辑推理方面有不错的表现。这让我很好奇,一个只有6亿参数的模型&#x…...
ONNX Runtime C++部署踩坑记:GetInputName已弃用,手把手教你改用GetInputNameAllocated
ONNX Runtime C部署实战:从GetInputName到GetInputNameAllocated的平滑迁移指南 在深度学习模型部署的生态系统中,ONNX Runtime凭借其跨平台特性和高性能推理能力,已成为工业界广泛采用的推理引擎。然而,随着其C API的迭代升级&a…...
SAP ABAP RFC函数外部调用Debug全攻略:从SE37设置到断点跟踪
SAP ABAP RFC函数外部调用Debug全攻略:从SE37设置到断点跟踪 在跨系统集成的复杂场景中,RFC函数调试往往让开发者头疼不已。想象一下这样的场景:你开发的RFC接口在生产环境突然报错,但本地测试一切正常;或者第三方系统…...
5个快速排查Goss测试失败的高效调试技巧
5个快速排查Goss测试失败的高效调试技巧 【免费下载链接】goss Goss是一个开源的Go语言测试框架,用于简化Go应用程序的测试和验证。它提供了一系列的测试断言和测试工具,可以帮助开发者编写更加简洁和可维护的测试代码。 项目地址: https://gitcode.co…...
Buildah多平台容器构建终极指南:使用QEMU跨架构构建Docker镜像
Buildah多平台容器构建终极指南:使用QEMU跨架构构建Docker镜像 【免费下载链接】buildah A tool that facilitates building OCI images. 项目地址: https://gitcode.com/gh_mirrors/bu/buildah Buildah作为专业的OCI镜像构建工具,为开发者提供了…...
还在为Apex Legends的后坐力烦恼吗?这款智能压枪宏让你轻松掌握精准射击
还在为Apex Legends的后坐力烦恼吗?这款智能压枪宏让你轻松掌握精准射击 【免费下载链接】Apex-NoRecoil-2021 Scripts to reduce recoil for Apex Legends. (auto weapon detection, support multiple resolutions) 项目地址: https://gitcode.com/gh_mirrors/ap…...
ArtiPub AI与Docker集成:构建可扩展的容器化发布系统
ArtiPub AI与Docker集成:构建可扩展的容器化发布系统 【免费下载链接】artipub Article publishing platform that automatically distributes your articles to various media channels 项目地址: https://gitcode.com/gh_mirrors/ar/artipub 在当今快速发展…...
