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

大话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;
}

相关文章:

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

1 malloc函数 函数说明&#xff1a; #include <stdlib.h>void *malloc(size_t size); 功能&#xff1a;在内存的动态存储区(堆区)中分配一块长度为size字节的连续区域&#xff0c;用来存放类型说明符指定的类型。分配的内存空间内容不确定。 参数&#xff1a;size&…...

第一个基于FISCOBCOS的前后端项目(发行转账)

本文旨在介绍一个简单的基于fiscobcos的前后端网站应用。Springbootjs前后端不分离。 所使用到的合约也是一个最基本的。首先您需要知道的是完整项目分为三部分&#xff0c;1是区块链平台webase搭建&#xff08;此项目使用节点前置webase-front即可&#xff09;&#xff0c;2是…...

python采集阿里巴巴历年员工人数统计报告

数据为2012到2022财年阿里巴巴每年的全职员工数量。截止2022年3月31日&#xff0c;阿里巴巴共有全职员工254941人&#xff0c;比上年增长3479人。 数据来源于阿里巴巴20-F和F-1文件 按阿里巴巴财政年度进行统计&#xff0c;阿里巴巴财年结束日期为每年3月31日 为全职员工人数 阿…...

git 基础场景操作

git基于当前分支创建分支&#xff0c;合并分支 git checkout -b new-batch git push origin new-batch git branch --set-upstream-toorigin/new-batch git pull git checkout master git merge origin new-batch git 开发分支合并 描述&#xff1a; git 我有 develop …...

代码随想录-DAY④-链表——leetcode 24 | 19 | 142

24 思路 如果 pre 的后面没有节点或者只有一个节点&#xff0c;则没有更多的节点需要交换, 否则&#xff0c;通过更新节点的指针关系交换 pre 后面的两个节点&#xff0c; 最后&#xff0c;返回新的链表的头节点 dummyhead->next。 时间复杂度&#xff1a;O(n) 空间复杂…...

ORA-12537: TNS:连接关闭/Io 异常: Got minus one from a read call

在另外一个数据库建立dblink的时候&#xff0c;发现执行命令报错&#xff1a; 被连接的数据库我也上去过&#xff0c;用工具尝试登陆也报错&#xff1a; IO Error: Got minus one from a read call, connect lapse 1 ms., Authentication lapse 0 ms. Got minus one from a …...

【Python】一文向您详细介绍 np.inner()

【Python】一文向您详细介绍 np.inner() 下滑即可查看博客内容 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#xff1a;985高校的普通本硕&#xff0c;曾…...

pdf分割,这几款软件轻松搞定PDF拆分

在数字化办公日益普及的今天&#xff0c;PDF文件因其跨平台、不易修改的特性&#xff0c;成为了我们日常工作中不可或缺的一部分。然而&#xff0c;面对庞大的PDF文件&#xff0c;如何高效、准确地将其分割成多个小文件&#xff0c;以便更好地管理和使用&#xff0c;成为了许多…...

【吊打面试官系列-MyBatis面试题】什么是 MyBatis 的接口绑定?有哪些实现方式?

大家好&#xff0c;我是锋哥。今天分享关于 【什么是 MyBatis 的接口绑定&#xff1f;有哪些实现方式&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 什么是 MyBatis 的接口绑定&#xff1f;有哪些实现方式&#xff1f; 接口绑定&#xff0c;就是在 MyBatis 中…...

实时消息推送系统,写得太好了!

websocket 协议是在 http 协议上的一种补充协议&#xff0c;是 html5 的新特性&#xff0c;是一种持久化的协议。其实 websocket 和 http 关系并不是很大&#xff0c;不过都是属于应用层的协议&#xff0c;接下来我们就开始实战。 websocket 定时推送 本教程基于 springboot …...

泛微E9开发 控制日期浏览按钮的可选日期范围

控制日期浏览按钮的可选日期范围 1、需求说明2、实现方法3、扩展知识点控制日期浏览按钮的可选日期范围格式参数说明演示 1、需求说明 控制日期浏览按钮的可选日期范围为2024/07/01~2024/07/31&#xff0c;如下图所示 2. 控制日期浏览按钮的可选日期范围在当前时间的前一周~当…...

ppt接单渠道大公开‼️

PPT 接单主要分两种&#xff1a;PPT 模板投稿和PPT 定制接单&#xff0c;我们先从简单的 PPT 模板投稿说起。 PPT 模板投稿 利用业余时间&#xff0c;做一些 PPT 模板上传到平台&#xff0c;只要有人下载你的模板&#xff0c;你就有收入。如果模板质量高&#xff0c;简直就是一…...

从零开始搭建vite开发环境

准备 nodejs 18 pnpm https://vitejs.cn/ 开始 pnpm init pnpm add -D vite新建index.html <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width…...

FastAPI本身是一个高性能的Web框架

FastAPI本身是一个高性能的Web框架&#xff0c;它并不直接支持数据库操作&#xff0c;但可以通过集成各种数据库库来与各种数据库进行交互。FastAPI支持几乎所有的关系型数据库和非关系型数据库&#xff0c;这主要取决于你选择的数据库库&#xff08;如ORM库&#xff09;以及相…...

yolov7:训练自己的数据集和测试

1、源代码&#xff1a;DataXujing/YOLOv7: :fire::fire::fire: Official YOLOv7训练自己的数据集并实现端到端的TensorRT模型加速推断 (github.com)2、参考的文献&#xff1a;⭐YOLOv7训练自己的数据集&#xff08;全网最详细 亲测有效&#xff09;⭐_python_Sunny&Meng-开…...

Redis 集群模式

文章目录 前言1. Redis Cluster 搭建1.1 准备节点1.2 准备配置文件1.3 查看集群状态 2. 客户端访问3. Python 连接集群4. Redis 集群维护4.1 新增节点4.2 手动分配 slot4.3 节点移除 5. 集群运维5.1 集群倾斜5.2 手动切换 前言 Redis 3.0 提供了 Redis Cluster 架构&#xff0…...

如何快速实现一个无缝轮播效果

&#x1f9d1;‍&#x1f4bb; 写在开头 点赞 收藏 学会&#x1f923;&#x1f923;&#x1f923; 需求简介 轮播图是我们前端开发中的一个常见需求&#xff0c;在项目开发中&#xff0c;我们可以使用element、ant等UI库实现。某些场景&#xff0c;为了一个简单的功能安装一…...

kubernetes集群证书过期问题解决

kubernetes集群证书过期问题解决 问题描述检查证书是否过期更新证书master节点操作node节点操作 问题描述 K8S 各个组件需要与 api-server 进行通信&#xff0c;通信使用的证书都存放在 /etc/kubernetes/pki 路径下&#xff0c;kubeadm 生成的证书大部分默认有效期为 1 年&…...

PHP框架详解-symfony框架

Symfony是一个使用PHP语言编写的开源Web应用框架&#xff0c;旨在加快开发进程&#xff0c;替代重复编码工作&#xff0c;并帮助构建可维护和可扩展的应用程序。以下是对Symfony框架的详细解析&#xff1a; 一、框架概述 Symfony提供了一组可重用的组件和一个标准化、可扩展的…...

Linux--线程的控制

目录 0.前言 1.pthread库 2.关于控制线程的接口 2.1.创建线程&#xff08;pthread_create&#xff09; 2.2.线程等待&#xff08;pthread_join&#xff09; 代码示例1&#xff1a; ​编辑 ***一些问题*** 2. 3.创建多线程 3.线程的终止 &#xff08;pthread_exit /…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险

C#入门系列【类的基本概念】&#xff1a;开启编程世界的奇妙冒险 嘿&#xff0c;各位编程小白探险家&#xff01;欢迎来到 C# 的奇幻大陆&#xff01;今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类&#xff01;别害怕&#xff0c;跟着我&#xff0c;保准让你轻松搞…...

C# 表达式和运算符(求值顺序)

求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如&#xff0c;已知表达式3*52&#xff0c;依照子表达式的求值顺序&#xff0c;有两种可能的结果&#xff0c;如图9-3所示。 如果乘法先执行&#xff0c;结果是17。如果5…...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时&#xff0c;没有加载所有类库。插件运行过程中用到某个类库&#xff0c;会从CAD的安装目录找&#xff0c;找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库&#xff0c;就用插件程序加载进…...

tauri项目,如何在rust端读取电脑环境变量

如果想在前端通过调用来获取环境变量的值&#xff0c;可以通过标准的依赖&#xff1a; std::env::var(name).ok() 想在前端通过调用来获取&#xff0c;可以写一个command函数&#xff1a; #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...

mac:大模型系列测试

0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何&#xff0c;是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试&#xff0c;是可以跑通文章里面的代码。训练速度也是很快的。 注意…...