C语言中如何动态分配内存并进行操作

C语言文章更新目录

C语言学习资源汇总,史上最全面总结,没有之一
C/C++学习资源(百度云盘链接)
计算机二级资料(过级专用)
C语言学习路线(从入门到实战)
编写C语言程序的7个步骤和编程机制
C语言基础-第一个C程序
C语言基础-简单程序分析
VS2019编写简单的C程序示例
简单示例,VS2019调试C语言程序
C语言基础-基本算法
C语言基础-数据类型
C语言中的输入输出函数
C语言流程控制语句
C语言数组——一维数组
C语言数组——二维数组
C语言数组——字符数组
C语言中常用的6个字符串处理函数
精心收集了60个C语言项目源码,分享给大家
C语言核心技术——函数
C代码是怎样跑起来的?
C语言实现字符串的加密和解密
C语言——文件的基本操作
使用C语言链表创建学生信息并且将信息打印输出
图解C语言冒泡排序算法,含代码分析
实例分析C语言中strlen和sizeof的区别
开发C语言的3款神器,VS2019、VScode和IntelliJ Clion
动图图解C语言选择排序算法,含代码分析
动图图解C语言插入排序算法,含代码分析
C语言指针数组和数组指针详解
5分钟搞懂C语言中的传值和传址
C语言——动态数组的创建和使用
C语言中#include<…>和#include“…“的区别
2024年C语言最新经典面试题汇总(1-10)
2024年C语言最新经典面试题汇总(11-20)

C语言实例专栏(持续更新中…)

C语言中允许程序在运行时创建和释放内存,以适应程序数据结构的大小变化或其他不确定的内存需求。也就是常说的动态内存分配。
这篇文章将详细介绍动态分配内存并进行操作的基本步骤以及注意事项。
在这里插入图片描述

动态内存分配的函数

1. malloc()

用于分配指定大小的内存块。其函数原型如下:

void *malloc(size_t size);

malloc() 接受一个参数 size,表示需要分配的字节数。如果内存分配成功,它返回一个指向已分配内存区域的指针;否则,若无法分配足够的内存,返回 NULL

2. calloc()

malloc() 类似,但额外提供了分配内存并将其所有字节初始化为零的功能。其函数原型如下:

void *calloc(size_t num, size_t size);

calloc() 接收两个参数:num 表示元素数量,size 表示每个元素的大小。它为 num 个大小为 size 的元素分配内存,并清零。返回值与 malloc() 相同。

3. realloc()

用于调整已分配内存块的大小。其函数原型如下:

void *realloc(void *ptr, size_t size);

realloc() 接收两个参数:ptr 是先前通过 malloc()calloc()realloc() 分配的内存区域的指针,size 是新的所需大小。它尝试调整指定内存块的大小,如果必要,可能会移动内存块到另一个位置。返回值为调整后内存块的新地址(可能与原地址相同或不同),若分配失败,则返回 NULL,此时原始内存块保持不变。

4. free()

用于释放之前动态分配的内存。其函数原型如下:

void free(void *ptr);

free() 接收一个参数 ptr,即之前由内存分配函数返回并不再使用的内存区域的指针。调用 free() 后,该内存区域被释放,可供后续分配使用。

动态内存分配的操作步骤

分配内存:

// 分配一个整数数组,包含10个元素
int *dynamicArray = (int*)malloc(sizeof(int) * 10);// 或者使用calloc,同时初始化为零
int *zeroInitializedArray = (int*)calloc(10, sizeof(int));

使用分配的内存:

// 填充动态数组
for (int i = 0; i < 10; ++i) {dynamicArray[i] = i * i;
}// 访问和操作动态分配的数据
printf("Element at index 5: %d\n", dynamicArray[5]);

调整内存大小(如果需要):

// 假设需要增加数组容量至20个元素
int *temp = (int*)realloc(dynamicArray, sizeof(int) * 20);
if (temp != NULL) {dynamicArray = temp; // 更新指针
} else {// 处理失败情况,可能保持原大小或采取其他策略printf("Failed to reallocate memory.\n");
}

释放内存:

// 使用完毕后释放内存
free(dynamicArray);
dynamicArray = NULL; // 可选:将指针置为NULL,防止后续误用

动态内存分配函数的实例

1. malloc() 示例

#include <stdio.h>
#include <stdlib.h>int main() {// 分配一个能存储10个整数的空间int *dynamicArray = (int*)malloc(sizeof(int) * 10);if (dynamicArray == NULL) {printf("Memory allocation failed.\n");return 1;}// 使用分配的内存for (int i = 0; i < 10; ++i) {dynamicArray[i] = i * i;}// 输出动态数组的内容for (int i = 0; i < 10; ++i) {printf("Element at index %d: %d\n", i, dynamicArray[i]);}// 释放内存free(dynamicArray);dynamicArray = NULL;return 0;
}
运行结果

在这里插入图片描述

在这个例子中,我们首先使用 malloc() 分配了一个能存储10个整数的空间。然后,我们填充这个动态数组,并打印其内容。最后,我们调用 free() 释放内存,并将指针置为 NULL,防止后续误用。

2. calloc() 示例

#include <stdio.h>
#include <stdlib.h>int main() {// 分配并初始化一个能存储5个浮点数的空间float *initializedArray = (float*)calloc(5, sizeof(float));if (initializedArray == NULL) {printf("Memory allocation failed.\n");return 1;}// 使用分配的内存for (int i = 0; i < 5; ++i) {initializedArray[i] = 1.0f / (i + 1);}// 输出初始化后的动态数组for (int i = 0; i < 5; ++i) {printf("Element at index %d: %.2f\n", i, initializedArray[i]);}// 释放内存free(initializedArray);initializedArray = NULL;return 0;
}
运行结果

在这里插入图片描述

此例中,我们使用 calloc() 分配并初始化了一个能存储5个浮点数的空间。所有元素初始值为0.0。然后,我们填充这个动态数组并打印其内容。最后,我们释放内存并将指针置为 NULL

3. realloc() 示例

#include <stdio.h>
#include <stdlib.h>int main() {int *dynamicArray = (int*)malloc(sizeof(int) * 5);if (dynamicArray == NULL) {printf("Memory allocation failed.\n");return 1;}// 填充初始的动态数组for (int i = 0; i < 5; ++i) {dynamicArray[i] = i * i;}// 打印初始数组内容printf("Initial array:\n");for (int i = 0; i < 5; ++i) {printf("Element at index %d: %d\n", i, dynamicArray[i]);}// 尝试将数组容量扩展至10个元素int *temp = (int*)realloc(dynamicArray, sizeof(int) * 10);if (temp != NULL) {dynamicArray = temp;// 填充新增的元素for (int i = 5; i < 10; ++i) {dynamicArray[i] = i * i;}} else {printf("Failed to reallocate memory. Keeping original size.\n");}// 打印扩展后的数组内容(或保持原大小)printf("Reallocated array:\n");for (int i = 0; i < (temp == NULL ? 5 : 10); ++i) {printf("Element at index %d: %d\n", i, dynamicArray[i]);}// 释放内存free(dynamicArray);dynamicArray = NULL;return 0;
}
运行结果在这里插入图片描述

在这个例子中,我们首先使用 malloc() 分配了一个能存储5个整数的空间,并填充了初始值。然后,我们尝试使用 realloc() 将数组容量扩展至10个元素。如果成功,我们填充新增的元素;否则,保持原大小。最后,我们打印扩展后的数组内容(或保持原大小),并释放内存。

注意事项

  • 检查返回值:在使用 malloc()calloc()realloc() 后,应检查返回的指针是否为 NULL,以判断分配是否成功。

  • 避免内存泄漏:当不再需要动态分配的内存时,务必调用 free() 进行释放。忘记释放会导致内存泄漏,长期运行的程序可能因此耗尽系统资源。

  • 匹配类型:分配内存时确保计算的大小与要存储的数据类型相符。使用 sizeof 运算符可以确保正确计算所需字节数。

  • 不要对未分配的内存或已释放的内存进行操作:这会导致未定义行为,严重时程序崩溃。

  • 使用 realloc() 时保护原有数据:如果 realloc() 返回新的地址,记得更新指向内存区域的所有指针,因为原有的内存可能已被移动。同时,如果 realloc() 失败,原内存块保持不变,仍可继续使用。

  • 避免内存碎片:合理规划内存分配与释放,减少频繁的小块内存分配与释放,有助于降低内存碎片,提高内存利用率。

  • 遵循分配与释放对称原则:确保每个 malloc()calloc()realloc() 都有对应的 free() 调用,且释放的是同一指针。

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

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

相关文章

32 mars3d 官方 demo 可以跑起来, 但是自己拷贝的 demo 跑不起来

前言 这个问题是 同事碰到的一个问题 主要的影响因素在于 官方的 demo 从 mars3d-cesium 中暴露了一部分文件作为 http 服务, 然后 我们自己的 case 里面没有这部分服务, 然后 导致 js 访问不到 以及 大部分的 css, js, img 等等 静态资源 访问不到 Cesium is not define…

11.创建后台系统项目

后台系统项目 兼容性 vite官网&#xff1a;https://vitejs.dev/ vite中文网&#xff1a;https://cn.vitejs.dev/ vite需要node.js版本 >14.0.0&#xff0c;建议16 node -v 查看版本号 创建项目 进入存放目录 执行命令 npm create vitelatest 选择vue框架 选择typescript…

苍穹外卖笔记

苍穹外卖 DAY01nginx反向代理MD5加密yapi进行接口导入Swagger介绍 DAY02新增员工需求分析和设计写相关代码测试(1. 后端文档测试 2. 前后端联调代码完善 员工分页查询DAY01 02涉及到的知识 DAY01 nginx反向代理 MD5加密 拓展&#xff1a;spring security jwt 提供了更强大灵…

登录校验:JWT令牌、Filter、Interceptor

JWT&#xff1a; 全称&#xff1a;JSON Web Token 定义了一种简洁的、自包含的格式&#xff0c;用于在通信双方以json数据格式安全的传输信息&#xff0c;由于数字签名的存在&#xff0c;这些信息是可靠的。 组成&#xff1a; Header(头部)&#xff1a;&#xff08;“alg&q…

银行5G短消息应用架构设计

&#xff08;一&#xff09;RCS简介 1.1 RCS的提出与标准制定 RCS(Rich Communication Services & Suite&#xff0c;富媒体通信)是GSMA(Groupe Speciale Mobile Association&#xff0c;全球移动通信系统协会)在2008年提出的一种通讯方式&#xff0c;RCS融合了语音、消息…

springboot3+jdk17+MP整合最新版jersey详细案例,正真做到拿来即用

如题&#xff0c;springboot3.x java17 MP 整合最新jersey&#xff0c;各种请求类型&#xff08;实战/详解&#xff09; 文件上传下载 jersey资源注册 拦截器&#xff08;JWT&#xff09; 跨域处理 全局异常 Valid注解校验 等等 &#xff0c;除非你必须整合security&am…

SpringCloud Alibaba Nacos简单应用(二)

&#x1f600;前言 本篇博文是关于SpringCloud Alibaba Nacos简单应用&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我的…

【spring】@Lazy注解学习

Lazy介绍 Lazy 注解是一个配置注解&#xff0c;用于指示 Spring 容器在创建 bean 时采用延迟初始化的策略。这意味着&#xff0c;除非 bean 被实际使用&#xff0c;否则不会被创建和初始化。 在 Spring 框架中&#xff0c;默认情况下&#xff0c;所有的单例 bean 在容器启动时…

【Linux】模拟实现shell(bash)

目录 常见的与shell互动场景 实现代码 全部代码 homepath()接口 const char *getUsername()接口 const char *getHostname()接口 const char *getCwd()接口 int getUserCommand(char *command, int num)接口 void commandSplit(char *in, char *out[])接口 int execut…

aurora仿真使用等

IP设置 代码 aurora_8b10b aurora_8b10b_inst (/**********************************************************************************///axi_stream tx.s_axi_tx_tdata(s_axi_tx_tdata), // input wire [0 : 31] s_axi_tx_tdata.s_axi_tx_tkeep(s_axi_tx_…

2024开年首展,加速科技展台“热辣滚烫”

3月20日&#xff0c;备受瞩目的半导体行业盛会SEMICON China 2024在上海新国际博览中心盛大启幕&#xff0c;展会汇集了来自全球的半导体领域顶尖企业与专业人士。加速科技作为业界领先的半导体测试设备供应商携重磅测试设备及解决方案精彩亮相&#xff0c;展示了最新的半导体测…

KIMI爆了!对比文心一言和通义千问它到底有多强?

原文:赵侠客 前言 最近国产大模型KIMI爆了大部分人应该都知道了&#xff0c;从我个人的感受来看这次KIMI爆了我不是从技术领域接触到的&#xff0c;而是从各种金融领域接触到的。目前国内大模型可以说是百模大战&#xff0c;前几年新能源大战&#xff0c;今年资本割完韭菜后留…

Linux:Prometheus的源码包安装及操作(2)

环境介绍 三台centos 7系统&#xff0c;运行内存都2G 1.prometheus监控服务器&#xff1a;192.168.6.1 主机名&#xff1a;pm 2.grafana展示服务器:192.168.6.2 主机名&#xff1a;gr 3.被监控服务器&#xff1a;192.168.6.3 …

codeTop102:二叉树的层序遍历

前言 在已知BFS的方式后&#xff0c;知道每次从队列中取一个节点&#xff0c;就要将这个节点的所有子节点按照顺序放入队列。 难点在于怎么确定将同一层的节点放在一个数组里面的输出&#xff0c;也就是输出一个二维数组&#xff1f; 解决方法: 每次while循环将队列上轮放入的…

Vue2(十):全局事件总线、消息订阅与发布、TodoList的编辑功能、$nextTick、动画

一、全局事件总线&#xff01;&#xff01; 任意组件间通信 比如a想收到别的组件的数据&#xff0c;那么就在a里面给x绑定一个demo自定义事件&#xff0c;所以a里面就得有一个回调函数吧&#xff0c;然后我要是想让d组件给a穿数据&#xff0c;那就让d去触发x的自定义事件&…

洛谷_P2678 [NOIP2015 提高组] 跳石头_python写法

P2678 [NOIP2015 提高组] 跳石头 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) d, n, m map(int,input().split())data [0] for i in range(n):value int(input())data.append(value) data.append(d)def check(mid):now 0cnt 0for i in range(1,n2):if abs(data[now]-da…

机器学习(27)

文章目录 文献阅读1. 题目2. abstract3. 网络架构3.1 Theoretical Results 4. 文献解读4.1 Introduction4.2 创新点4.3 实验过程4.3.1 数据集4.3.2 参数设置 4.4 结论 三、实现GAN1. 任务要求2. 实验结果3.实验代码3.1数据准备3.2 模型构建3.3 展示函数3.4 训练过程 小结本周内…

从0写一个问卷调查APP的第13天-1

1.今日任务 我也只是一个大学生&#xff0c;有什么思路不对的地方给我指出来哟! 分析&#xff1a;上次我们实现了任务调查的插入。但是我们插入的问卷调查只有它的标题&#xff0c;也就是这个问卷调查是什么我们告诉数据库了&#xff0c;但是现在我们还没有给它添加任何问题&…

蓝桥杯真题:幸运数字

这道题可以用 integer.string&#xff08;&#xff09;求每个进制的数&#xff0c;但这里要每一位数相加&#xff0c;所以用这个方法会比较麻烦&#xff0c;如下 import java.util.Scanner; public class Main {public static void main(String[] args) {Scanner scan new Sc…

华为OD机试真题-推荐多样性-2024年OD统一考试(C卷)

题目描述: 推荐多样性需要从多个列表中选择元素,一次性要返回N屏数据(窗口数量),每屏展示K个元素(窗口大小),选择策略: 1. 各个列表元素需要做穿插处理,即先从第一个列表中为每屏选择一个元素,再从第二个列表中为每屏选择一个元素,依次类推 2. 每个列表的元素尽量均…