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语言中泄漏缓冲区的问题解决》缓冲区是一种常见的数据结构,常被用于在不同的并发单元之间传递数据,然而,若缓冲区使用不当,就可能引发泄漏缓冲区问题,本文就来介绍一下问题的解决,感兴趣的可以了解一下... 目录引言泄漏缓冲区的基本概念代码示例:泄漏缓冲区的产生项目场景:Web 服务器中的请求缓冲场景描述代码

Go语言如何判断两张图片的相似度

《Go语言如何判断两张图片的相似度》这篇文章主要为大家详细介绍了Go语言如何中实现判断两张图片的相似度的两种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 在介绍技术细节前,我们先来看看图片对比在哪些场景下可以用得到:图片去重:自动删除重复图片,为存储空间"瘦身"。想象你是一个

Go语言中Recover机制的使用

《Go语言中Recover机制的使用》Go语言的recover机制通过defer函数捕获panic,实现异常恢复与程序稳定性,具有一定的参考价值,感兴趣的可以了解一下... 目录引言Recover 的基本概念基本代码示例简单的 Recover 示例嵌套函数中的 Recover项目场景中的应用Web 服务器中

MySQL启动报错:InnoDB表空间丢失问题及解决方法

《MySQL启动报错:InnoDB表空间丢失问题及解决方法》在启动MySQL时,遇到了InnoDB:Tablespace5975wasnotfound,该错误表明MySQL在启动过程中无法找到指定的s... 目录mysql 启动报错:InnoDB 表空间丢失问题及解决方法错误分析解决方案1. 启用 inno

在Java中基于Geotools对PostGIS数据库的空间查询实践教程

《在Java中基于Geotools对PostGIS数据库的空间查询实践教程》本文将深入探讨这一实践,从连接配置到复杂空间查询操作,包括点查询、区域范围查询以及空间关系判断等,全方位展示如何在Java环... 目录前言一、相关技术背景介绍1、评价对象AOI2、数据处理流程二、对AOI空间范围查询实践1、空间查

MySQL表空间结构详解表空间到段页操作

《MySQL表空间结构详解表空间到段页操作》在MySQL架构和存储引擎专题中介绍了使用不同存储引擎创建表时生成的表空间数据文件,在本章节主要介绍使用InnoDB存储引擎创建表时生成的表空间数据文件,对... 目录️‍一、什么是表空间结构1.1 表空间与表空间文件的关系是什么?️‍二、用户数据在表空间中是怎么

Go语言中使用JWT进行身份验证的几种方式

《Go语言中使用JWT进行身份验证的几种方式》本文主要介绍了Go语言中使用JWT进行身份验证的几种方式,包括dgrijalva/jwt-go、golang-jwt/jwt、lestrrat-go/jw... 目录简介1. github.com/dgrijalva/jwt-go安装:使用示例:解释:2. gi

Go 语言中的 Struct Tag 的用法详解

《Go语言中的StructTag的用法详解》在Go语言中,结构体字段标签(StructTag)是一种用于给字段添加元信息(metadata)的机制,常用于序列化(如JSON、XML)、ORM映... 目录一、结构体标签的基本语法二、json:"token"的具体含义三、常见的标签格式变体四、使用示例五、使用

Go语言使用slices包轻松实现排序功能

《Go语言使用slices包轻松实现排序功能》在Go语言开发中,对数据进行排序是常见的需求,Go1.18版本引入的slices包提供了简洁高效的排序解决方案,支持内置类型和用户自定义类型的排序操作,本... 目录一、内置类型排序:字符串与整数的应用1. 字符串切片排序2. 整数切片排序二、检查切片排序状态:

CentOS7增加Swap空间的两种方法

《CentOS7增加Swap空间的两种方法》当服务器物理内存不足时,增加Swap空间可以作为虚拟内存使用,帮助系统处理内存压力,本文给大家介绍了CentOS7增加Swap空间的两种方法:创建新的Swa... 目录在Centos 7上增加Swap空间的方法方法一:创建新的Swap文件(推荐)方法二:调整Sww