大话C语言:第28篇 内存分配与释放

1 malloc函数

函数说明:

#include <stdlib.h>void *malloc(size_t size);
功能:在内存的动态存储区(堆区)中分配一块长度为size字节的连续区域,用来存放类型说明符指定的类型。分配的内存空间内容不确定。
参数:size:需要分配内存大小(单位:字节)
返回值:成功:分配空间的起始地址失败:NULL

代码示例:

#include <stdio.h>  
#include <stdlib.h>  int main() {  // 使用 malloc() 分配内存来存储 5 个整数  int *array = (int *)malloc(5 * sizeof(int));  // 检查 malloc() 是否成功分配了内存  if (array == NULL) {  printf("内存分配失败\n");  return -1; // 返回非零值表示错误  }  // 初始化分配的内存中的整数  for (int i = 0; i < 5; i++) {  array[i] = i + 1;  }  // 打印整数的值  printf("数组中各元素分别是:\n");  for (int i = 0; i < 5; i++) {  printf("%d ", array[i]);  }  printf("\n");  // 释放分配的内存  free(array);  // 尝试访问已释放的内存可能会导致问题,所以不再使用 array 指针  // 将指针设置为 NULL 以避免悬挂指针 array = NULL;  return 0;  
}

2 calloc函数

函数说明:

#include <stdlib.h>void *calloc(size_t num, size_t size);
功能:该函数与malloc()类似,但它还需要一个额外的参数来表示要分配的元素数量。它会返回一个指向已初始化为零的内存块的指针。
参数:num指定要分配的元素数量。size指定每个元素的大小。
返回值:成功:分配的内存块的指针失败:NULL

代码示例:

#include <stdio.h>  
#include <stdlib.h>  int main() {  // 使用 calloc() 分配内存来存储 10 个整数,并初始化为 0  int *array = (int *)calloc(10, sizeof(int));  // 检查 calloc() 是否成功分配了内存  if (array == NULL) {  printf("内存分配失败\n");  return -1; }  // 给数组中的每个元素赋一个值  for (int i = 0; i < 10; i++) {  array[i] = i * 2; }  // 打印数组中的值  printf("数组各个元素值分别是:\n");  for (i = 0; i < 10; i++){  printf("%d ", array[i]);  }  printf("\n");  // 释放分配的内存  free(array);  // 将指针设置为 NULL,避免悬挂指针  array = NULL;  return 0;  
}

3 realloc()函数

函数说明:

#include <stdlib.h>void *realloc(void *ptr, size_t new_size);
功能:用于调整之前分配的内存块的大小。如果调整成功,它会返回指向新内存块的指针;如果失败,它会返回NULL。
参数:ptr:指向一个之前由malloc(), calloc(), 或 realloc() 函数分配的内存块的指针。如果 ptr 是 NULL,那么 realloc() 的行为就如同 malloc(),分配一块大小为 new_size 的新内存。new_size:重新分配的内存块的大小,以字节为单位。
返回值:如果内存重新分配成功,realloc() 返回指向新内存块的指针。这个指针可能与 ptr 相同(如果重新分配发生在原地),也可能不同(如果内存块移动了位置)。如果内存重新分配失败,realloc() 返回 NULL,并且原内存块 ptr 保持不变(不会被自动释放)。    

代码示例:

#include <stdio.h>  
#include <stdlib.h>  int main() {  int *array = (int *)malloc(5 * sizeof(int));  if (array == NULL) {  perror("Memory allocation failed");  return 1;  }  // 初始化数组  for (int i = 0; i < 5; i++) {  array[i] = i;  }  // 打印原始数组  printf("Original array:\n");  for (int i = 0; i < 5; i++) {  printf("%d ", array[i]);  }  printf("\n");  // 尝试将数组大小增加到10  int *new_array = (int *)realloc(array, 10 * sizeof(int));  if (new_array == NULL) {  printf("内存重新分配失败\n");  // 释放原始内存  free(array); return 1;  }  // 更新指针  array = new_array;  // 初始化新分配的内存部分  for (int i = 5; i < 10; i++) {  array[i] = i;  }  // 打印新数组  printf("扩展后的数组:\n");  for (int i = 0; i < 10; i++) {  printf("%d ", array[i]);  }  printf("\n");  // 释放内存  free(array); // 将指针设置为 NULL,避免悬挂指针  array = NULL; return 0;  
}

4 free函数

函数说明:

#include <stdlib.h>
void free(void *ptr);
功能:释放ptr所指向的一块内存空间,ptr是一个任意类型的指针变量,指向被释放区域的首地址。对同一内存空间多次释放会出错。
参数:ptr:需要释放空间的首地址,被释放区应是由malloc函数所分配的区域。
返回值:无

代码示例:

#include <stdlib.h>
#include <stdio.h>int main() {int n = 0;printf("请输入要申请数组的个数: ");scanf("%d", &n);// 堆区申请 n * sizeof(int) 空间,等价int arr[n]int *arr = (int *)malloc(n * sizeof(int));if (arr == NULL) {printf("申请空间失败!\n");return -1;}for (int i = 0; i < n; i++){// 给数组赋值arr[i] = i;}for (int i = 0; i < n; i++) {// 输出数组每个元素的值printf("%d, ", *(arr+i));}// 释放堆区空间free(arr);// 将指针设置为 NULL,避免悬挂指针  array = NULL; return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/44755.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记一次Ueditor上传Bypss

前言 前一段时间和小伙伴在某内网进行渗透测试&#xff0c;目标不给加白&#xff0c;只能进行硬刚了&#xff0c;队友fscan一把梭发现某资产疑似存在Ueditor组件&#xff0c;但初步测试是存在waf和杀软的&#xff0c;无法进行getshell&#xff0c;经过一番折腾最终getshell&am…

ESP32-C3模组上跑通AES-GCM(7)

接前一篇文章:ESP32-C3模组上跑通AES-GCM(6) 四、ESP-IDF中的AES-GCM例程解析 上一回继续对ESP-IDF中的AES-GCM进行讲解,讲解了components\components\mbedtls\test_apps\main\test_aes_gcm.c中例程的aes_gcm_test函数的第2段代码。本回继续往下讲解该函数。 1. aes_gcm_…

一个 Docker 搭建的自动化电视剧下载和管理工具

大家好,我是CodeQi! 一个标准的“追剧狂人”。每周都有新剧上线,每天都要时刻关注各大影视平台的更新,这无疑是一项体力与脑力并存的艰巨任务。 于是,我决定为自己打造一个自动化的电视剧下载和管理工具。作为一个程序员,用 Docker 搭建这种自动化工具简直是小菜一碟。…

PointCloudLib GridMinimum获取栅格最低点 C++版本

测试效果 简介 在点云库(Point Cloud Library, PCL)中,如果你想要获取一个栅格(Grid)内的最低点,这通常意味着你需要先对点云数据进行某种形式的栅格化处理,然后在每个栅格内寻找最低的点。 测试代码 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointC…

f_mkfs格式化最小分区数是191

使用fatfs的f_mkfs最小分区数是191原因&#xff1a; 在挂载ram_disk时参考的文章有提到&#xff1a; “然后是GET_SECTOR_COUNT 用于f_mkfs格式化时获取可用的sector的数量&#xff0c;32bit-LBA的情况下至少为191” 自己也实际试过确实要不少于191&#xff0c;网上也没找到相…

【单片机毕业设计选题24056】-基于STM32的八路抢答器设计

系统功能: 系统上电后显示“欢迎使用八路抢答系统请稍后”&#xff0c;两秒后进入正常页面显示。 第一行显示系统状态信息&#xff0c;第二行显示抢答计时时间&#xff0c;第三行显示设定的抢答时间&#xff0c; 第四行显示系统状态&#xff08;空闲状态或计时状态&#xff…

CST软件仿真内存设置-电磁仿真cst软件教程

当大家使用CST软件进行仿真时&#xff0c;可能会有仿真内存的设置需求&#xff0c;下面的内容是帮助大家如何设置仿真内存。 首先&#xff0c;打开CST软件并加载您的仿真模型&#xff0c;在软件界面中&#xff0c;找到菜单栏或工具栏中的“仿真设置”或类似的选项。 在仿真设置…

揭秘”大模型加速器”如何助力大模型应用

文章目录 一、大模型发展面临的问题二、“大模型加速器”助力突破困难2.1 现场效果展示2.1.1 大模型加速器——文档解析引擎2.2.2 图表数据提取 三、TextIn智能文档处理平台3.1 在线免费体验3.1.1 数学公式提取3.1.2 表格数据提取 四、acge文本向量化模型4.1 介绍4.2 技术创新4…

数据仓库介绍_维度表(三)

维度表概述 维度表是维度建模的基础和灵魂。前文提到&#xff0c;事实表紧紧围绕业务过程进行设计&#xff0c;而维度表则围绕业务过程所处的环境进行设计。维度表主要包含一个主键和各种维度字段&#xff0c;维度字段称为维度属性。 表设计步骤 确定维度&#xff08;表&…

Django项目的基本准备工作【1】

【 一 】pip换源 # 1 之前装第三方模块 pip3 install django -i 镜像仓库 ​ # 2 一劳永逸--》整点配置&#xff0c;以后安装模块&#xff0c;自动去配置好的源下载 ###windows 1、文件管理器文件路径地址栏敲&#xff1a;%APPDATA% 回车&#xff0c;快速进入 C:\Users\电脑用…

Sentinel-1 Level 1数据处理的详细算法定义(三)

《Sentinel-1 Level 1数据处理的详细算法定义》文档定义和描述了Sentinel-1实现的Level 1处理算法和方程&#xff0c;以便生成Level 1产品。这些算法适用于Sentinel-1的Stripmap、Interferometric Wide-swath (IW)、Extra-wide-swath (EW)和Wave模式。 今天介绍的内容如下&…

vscode远程调试python代码

第一步&#xff1a; vscode设置 vscode也支持通过remote的方法连接我们在命令行中发起的debug server。首先我们要配置一下debug的config。 还是点击VSCode侧边栏的“Run and Debug”&#xff08;运行和调试)&#xff0c;单击"create a lauch.json file" 第二步&a…

创建React 项目的几种方式

①.react自带脚手架 使用步骤&#xff1a; 1、下载 npm i create-react-app -g 2、创建项目命令&#xff1a; create-react-app 项目名称 ②.Vite构建工具创建react步骤&#xff1a;&#xff08;推荐&#xff09; 方法一&#xff1a; 1、yarn create vite 2、后续根据提示步…

系统架构设计师 - 数学与经济管理

数学与经济管理 数学与经济管理&#xff08;1 - 2分&#xff09;图论应用最小生成树最短路径网络与最大流量 ★ 运筹方法关键路径法 ★ ★ ★线性规划 ★动态规划 ★ ★ ★排队论预测与决策 ★预测 - 博弈论决策 数学建模 ★ ★ 大家好呀&#xff01;我是小笙&#xff0c;本章我…

线程安全(有点乱哈)

1.多个进程访问共享资源&#xff0c;通过上锁保证数据安全 1.2锁的宏观分类方式是悲观锁和乐观锁 1.3悲观锁和乐观锁 悲观锁&#xff1a;拿数据上锁‘ 举例&#xff1a;synchronzied 乐观锁&#xff1a;每次拿数据的时候不会上锁&#xff0c;更新数据&#xff0c;比较下版…

抖音机构号授权矩阵系统源码:打造自媒体帝国的新利器

在自媒体风起云涌的时代&#xff0c;抖音作为短视频领域的佼佼者&#xff0c;早已成为内容创作者们争相入驻的热门平台。然而&#xff0c;随着竞争加剧&#xff0c;如何在这场流量大战中脱颖而出&#xff0c;成为每一位自媒体人不得不面对的课题。今天&#xff0c;我们将带您深…

MySQL性能优化篇之SQL语句优化

目录 向数据库请求不需要的数据查询不需要的记录总是返回全部的列 MySQL扫描了额外的行扫描的行数和返回的行数行访问类型也要注意extra列的信息优化扫描行数过多的建议 重构查询方式一个复杂的查询还是多个简单的查询切分查询 常用的查询技巧使用内连接而不是外连接优化关联查…

防火墙一些有关知识

防火墙概述 防火墙核心任务 控制和防护 如何发挥功能 防火墙通过安全策略识别列两并做出相应动作。和ACL一样&#xff0c;所以防火墙本质就是ACL 防火墙分类 按物理特性划分 软件防火墙&#xff1a;电脑带的防火墙 硬件防火墙&#xff1a;设备&#xff0c;这个设备做的就…

深度学习之网络构建

目标 选择合适的神经网络 卷积神经网络&#xff08;CNN&#xff09;&#xff1a;我们处理图片、视频一般选择CNN 循环神经网络&#xff08;RNN&#xff09;&#xff1a;我们处理时序数据一般选择RNN 超参数的设置 为什么训练的模型的错误率居高不下 如何调测出最优的超参数 …

练习 5.10:检查⽤户名 按照下⾯的说明编写⼀个程序,模拟⽹站如 何确保每个⽤户的⽤户名都独⼀⽆⼆。

练习 5.10&#xff1a;检查⽤户名 按照下⾯的说明编写⼀个程序&#xff0c;模拟⽹站如 何确保每个⽤户的⽤户名都独⼀⽆⼆。 要求 创建⼀个⾄少包含 5 个⽤户名的列表&#xff0c;并将其命名为 current_users。 再创建⼀个包含 5 个⽤户名的列表&#xff0c;将其命名为 new_…