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行输入为空格分…...

Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...

用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...

Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...

MySQL的pymysql操作
本章是MySQL的最后一章,MySQL到此完结,下一站Hadoop!!! 这章很简单,完整代码在最后,详细讲解之前python课程里面也有,感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...

spring Security对RBAC及其ABAC的支持使用
RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型,它将权限分配给角色,再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...

前端开发者常用网站
Can I use网站:一个查询网页技术兼容性的网站 一个查询网页技术兼容性的网站Can I use:Can I use... Support tables for HTML5, CSS3, etc (查询浏览器对HTML5的支持情况) 权威网站:MDN JavaScript权威网站:JavaScript | MDN...

一些实用的chrome扩展0x01
简介 浏览器扩展程序有助于自动化任务、查找隐藏的漏洞、隐藏自身痕迹。以下列出了一些必备扩展程序,无论是测试应用程序、搜寻漏洞还是收集情报,它们都能提升工作流程。 FoxyProxy 代理管理工具,此扩展简化了使用代理(如 Burp…...