C语言动态内存空间分配(malloc,calloc,realloc,free)

2024-09-06 08:04

本文主要是介绍C语言动态内存空间分配(malloc,calloc,realloc,free),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

为了代码观感美观,我将代码部分的注释删了

malloc

#include<stdio.h>
#include<stdlib.h>
#include<errno.h>//使用动态内存分配函数的注意事项:
//1.要判断指针是否为空指针,如果没有成功开辟动态内存空间,则不能继续使用该指针
//2.分配的动态内存空间的数量要大于等于赋值的元素的数量,不能造成动态内存的越界访问
//3.动态内存空间中的地址是在堆区,不能将非动态内存空间的地址赋值给堆区,
//  但可以将变量的值赋值给动态内存空间所指向的位置
//4.不能对非动态内存空间的地址进行free释放// 动态内存分配 malloc(wantMemorySize)
int main(){int* p = (int*)malloc(10 * sizeof(int));if (p == NULL){printf("%s\n", strerror(errno));}else{for (int i = 0; i < 10; i++){*(p + i) = i;int num = *(p + i);printf("%d\t", num);//0       1       2       3       4       5       6       7       8       9}}//当申请的动态内存空间不再使用时,应该还给系统printf("\n%d\n", p[4]);//4free(p);//free之后还要置为NULL,否则成为野指针,因为地址还在,只是地址里面的值没了p[5] = 1;printf("%d\n%d\n", p[4],p[5]);// -572662307  1p = NULL;return 0;
}

calloc

// calloc(count,sizeof(Type))默认将开辟的动态内存数组空间置为0, 因为初始化了,所以效率比malloc低。
int main(){int* p = (int*)calloc(10, sizeof(int));if (p == NULL){printf("%s\n", strerror(errno));}else{for (int i = 0; i < 10; i++){printf("%d\t", p[i]);}}// free函数用来释放动态内存空间的free(p);p = NULL;return 0;
}

realloc

//realloc(oldMemoryAddress , wantMemorySize)
//调整开辟的动态内存空间的大小
int main(){// 先使用malloc开辟20个字节的空间int* p = (int*)malloc(5 * sizeof(int));if (p == NULL){printf("%s\n", strerror(errno));}else{for (int i = 0; i < 5; i++){*(p + i) = i;printf("%d\t", *(p + i));//0       1       2       3       4}printf("\n");}//假设20个字节不能满足我们的使用了//现在希望有40个字节的动态内存空间可以使用//realloc调整开辟的动态内存空间的大小//1.realloc如果旧地址后面的空间能够满足新增的空间大小,就追加到旧地址的后面,返回旧地址//2.否则就开辟一块新的动态内存空间,将旧动态内存空间中的值拷到新动态内存空间中相应的位置,//  然后释放旧的动态内存空间,返回新动态内存空间的地址int* p_realloc = (int*)realloc( p , 40);if (p_realloc == NULL){printf("%s", strerror(errno));}else{ //不管是新地址还是旧地址依然给p管理,达到为p增加动态内存空间的目的p = p_realloc;for (int i = 5; i < 10; i++){*(p + i) = i;}for (int i = 0; i < 10; i++){printf("%d\t", *(p + i));//0       1       2       3       4       5       6       7       8       9  }}//因为p和realloc存放的地址是一样的,只需要把p放了就行free(p);p = NULL;p_realloc = NULL;return 0;
}//realloc也可以和malloc一样开辟动态内存空间
//realloc(NULL,memorySize)
int main(){int* p = realloc(NULL, 10 * sizeof(int));if (p == NULL){printf("%s", strerror(errno));}else{for (int i = 0; i < 10; i++){*(p + i) = i;printf("%d", *(p + i));//0123456789}}free(p);p = NULL;return 0;
}

这篇关于C语言动态内存空间分配(malloc,calloc,realloc,free)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1141456

相关文章

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

Go语言中json操作的实现

《Go语言中json操作的实现》本文主要介绍了Go语言中的json操作的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录 一、jsOChina编程N 与 Go 类型对应关系️ 二、基本操作:编码与解码 三、结构体标签(Struc

C#利用Free Spire.XLS for .NET复制Excel工作表

《C#利用FreeSpire.XLSfor.NET复制Excel工作表》在日常的.NET开发中,我们经常需要操作Excel文件,本文将详细介绍C#如何使用FreeSpire.XLSfor.NET... 目录1. 环境准备2. 核心功能3. android示例代码3.1 在同一工作簿内复制工作表3.2 在不同

python语言中的常用容器(集合)示例详解

《python语言中的常用容器(集合)示例详解》Python集合是一种无序且不重复的数据容器,它可以存储任意类型的对象,包括数字、字符串、元组等,下面:本文主要介绍python语言中常用容器(集合... 目录1.核心内置容器1. 列表2. 元组3. 集合4. 冻结集合5. 字典2.collections模块

基于Go语言开发一个 IP 归属地查询接口工具

《基于Go语言开发一个IP归属地查询接口工具》在日常开发中,IP地址归属地查询是一个常见需求,本文将带大家使用Go语言快速开发一个IP归属地查询接口服务,有需要的小伙伴可以了解下... 目录功能目标技术栈项目结构核心代码(main.go)使用方法扩展功能总结在日常开发中,IP 地址归属地查询是一个常见需求:

MySQL8.0临时表空间的使用及解读

《MySQL8.0临时表空间的使用及解读》MySQL8.0+引入会话级(temp_N.ibt)和全局(ibtmp1)InnoDB临时表空间,用于存储临时数据及事务日志,自动创建与回收,重启释放,管理高... 目录一、核心概念:为什么需要“临时表空间”?二、InnoDB 临时表空间的两种类型1. 会话级临时表

Three.js构建一个 3D 商品展示空间完整实战项目

《Three.js构建一个3D商品展示空间完整实战项目》Three.js是一个强大的JavaScript库,专用于在Web浏览器中创建3D图形,:本文主要介绍Three.js构建一个3D商品展... 目录引言项目核心技术1. 项目架构与资源组织2. 多模型切换、交互热点绑定3. 移动端适配与帧率优化4. 可

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作