iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >一文带你搞懂C语言动态内存管理
  • 671
分享到

一文带你搞懂C语言动态内存管理

C语言动态内存管理C语言内存管理C语言内存 2022-11-13 19:11:08 671人浏览 独家记忆
摘要

目录一、malloc函数和free函数二、calloc函数与malloc函数的异同三、柔性数组一、malloc函数和free函数 (1) 这个函数向内存申请一块连续可用的空间,并返回

一、malloc函数和free函数

(1) 这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。

如果开辟成功,则返回一个指向开辟好空间的指针。

如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。

返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定。

如果参数 size为0,malloc的行为是标准是未定义的,取决于编译器。

void* malloc (size_t size);

(2) free函数

free函数用来释放动态开辟的内存。

如果参数 ptr 指向的空间不是动态开辟的,那free函数的行为是未定义的。

如果参数 ptr是NULL指针,则函数什么事都不做。

二、calloc函数与malloc函数的异同

(1)函数的功能是为 num 个大小为 size 的元素开辟一块空间,并且把空间的每个字节初始化为0。

(2)与函数 malloc 的区别只在于 calloc 会在返回地址之前把申请的空间的每个字节初始化为全0。

(3)例如

#include<stdio.h>
int main()
{
	int* p = calloc(10, sizeof(int));
	if (NULL != p)
	{
	   //使用空间
	}

	free(p);
	p = NULL;
	return 0;
}

三、柔性数组

(1)特点

  • 结构中的柔性数组成员前面必须至少一个其他成员。2. sizeof 返回的这种结构大小不包括柔性数组的内存。
  • 包含柔性数组成员的结构用malloc ()函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应 柔性数组的预期大小。

(2)使用优势

//代码1
#include<stdio.h>
typedef struct st_type
{
	int i;
	int a[0];//柔性数组成员
}type_a;
void main()
{
	printf("%d\n", sizeof(type_a));//输出的是4
	int i = 0;
	type_a* p = (type_a*)malloc(sizeof(type_a) + 100 * sizeof(int));
	//业务处理
	p->i = 100;
	for (i = 0; i < 100; i++)
	{
		p->a[i] = i;
	}
	free(p);
}
//代码2
#include<stdio.h>
typedef struct st_type
{
	int i;
	int* p_a;
}type_a;
void main()
{
	type_a* p = malloc(sizeof(type_a));
	p->i = 100;
	p->p_a = (int*)malloc(p->i * sizeof(int));
	//业务处理
	for (int i = 0; i < 100; i++)
	{
		p->p_a[i] = i;
	}
	//释放空间
	free(p->p_a);
	p->p_a = NULL;
	free(p);
	p = NULL;
}

上述代码1和代码2都可以完成同样的功能,但是方法1的实现有两个好处:

1. 方便内存释放

如果我们的代码是在一个给别人用的函数中,你在里面做了二次内存分配,并把整个结构体返回给用户。用户调用free可以释放结构体,但是用户并不知道这个结构体内的成员也需要free,所以你不能指望用户来发现这个事。所以,如果我们把结构体的内存以及其成员要的内存一次性分配好了,并返回给用户一个结构体指针,用户做一次free就可以把所有的内存也给释放掉。

2. 这样有利于访问速度.

连续的内存有益于提高访问速度,也有益于减少内存碎片。

到此这篇关于一文带你搞懂C语言动态内存管理的文章就介绍到这了,更多相关C语言内存管理内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 一文带你搞懂C语言动态内存管理

本文链接: https://www.lsjlt.com/news/170866.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 一文带你搞懂C语言动态内存管理
    目录一、malloc函数和free函数二、calloc函数与malloc函数的异同三、柔性数组一、malloc函数和free函数 (1) 这个函数向内存申请一块连续可用的空间,并返回...
    99+
    2022-11-13
    C语言动态内存管理 C语言 内存管理 C语言 内存
  • 一文带你搞懂C语言预处理宏定义
    目录预定义符号#define#define 定义标识符#define 定义宏替换规则# 和##预定义符号 这些预定义符号都是语言内置的 __FILE__ //进行编译的源文...
    99+
    2022-11-13
    C语言预处理宏定义 C语言 宏定义 C语言 预处理
  • 一文带你搞懂Python上下文管理器
    目录一、什么是上下文管理器二、如何实现上下文管理器1. 通过类实现1)_enter_2)_exit_2. 通过contextlib实现总结一、什么是上下文管理器 我们在处理文件的时候...
    99+
    2024-04-02
  • C语言的动态内存管理你了解吗
    目录C/C++内存分配方式C++内存管理方式new和delete的使用new和delete的骚操作new和delete的区别重载new和delete定位new表达式内存泄露总结C/C...
    99+
    2024-04-02
  • 一文带你搞懂Golang结构体内存布局
    目录前言结构体内存布局结构体大小内存对齐总结前言 结构体在Go语言中是一个很重要的部分,在项目中会经常用到,大家在写Go时有没有注意过,一个struct所占的空间不一定等于各个字段加...
    99+
    2024-04-02
  • 【C语言进阶】动态内存管理
    动态内存管理 1.为什么存在动态内存分配2.动态内存函数的介绍2.1malloc和free2.2calloc2.3realloc 3.常见的动态内存错误3.1 对NULL指针的解引用操作...
    99+
    2023-10-25
    c语言 开发语言 1024程序员节
  • C语言动态内存管理介绍
    目录前言:C 语言为内存的分配和管理提供了几个函数:1.malloc() 用法2.calloc() 用法3.realloc() 与 free() 用法前言: 简单记录一下,内存管理...
    99+
    2024-04-02
  • 手把手带你搞懂C语言指针
    目录前言一、概念1.*指针2.&取址二、指针修饰符1.const 常量指针2.volatile 特征指针3.typedef 别名指针三、指针运算1. ++ -- + -2.[...
    99+
    2024-04-02
  • C语言中动态内存管理图文详解
    目录1.动态内存开辟的原因2.动态内存函数的介绍2.1malloc和free2.2calloc2.3realloc3.常见的动态内存错误3.1对NULL指针的解引用操作3.2对动态开...
    99+
    2024-04-02
  • 一篇文章带你搞懂Go语言标准库Time
    目录前言时间类型时间戳时间间隔操作时间AddSubEqualBeforeAfter定时器时间格式化解析字符串格式的时间总结前言 在编程过程中,我们经常会用到与时间和日期相关的各种需求...
    99+
    2024-04-02
  • C语言动态内存管理的实现
    目录1. 摘要2. 为什么存在动态内存管理3. 动态内存函数3.1 malloc3.2 free3.3 calloc3.4 realloc4. 常见的动态内存错误5. 几个经典笔试题...
    99+
    2024-04-02
  • 详解C语言之动态内存管理
    目录开辟动态内存的函数释放开辟的动态内存空间的函数错误信息函数具体使用例: 常见的动态内存错误总结先来了解一下动态管理内存所需用到的函数 开辟动态内存的函数 1.mallo...
    99+
    2024-04-02
  • 一文详解C++中动态内存管理
    目录前言1、C/C++程序的内存开辟2.C语言中动态内存管理方式:malloc/calloc/realloc/free2.1malloc、calloc、realloc区别?3.C++...
    99+
    2024-04-02
  • C语言 动态内存管理全面解析
    目录1. 为什么存在动态内存分配2. 动态内存函数的介绍2.1 malloc和free2.2 calloc 2.3 realloc3. 常见的动态内存错误3.1 对NULL...
    99+
    2024-04-02
  • 关于C语言动态内存管理介绍
    目录1.为什么需要动态内存分配2.有关动态内存函数介绍2.1 malloc和free2.2 calloc函数2.3 realloc函数3. 常见的动态内存错误3.1 对NULL指针进...
    99+
    2024-04-02
  • 详解C语言中的动态内存管理
    目录一、动态内存管理1.1为什么要有动态内存管理1.2动态内存介绍1.3常见的动态内存错误一、动态内存管理 1.1为什么要有动态内存管理 1.1.1  在c语言中我们普通的...
    99+
    2022-12-12
    C语言动态内存管理 C语言 内存管理 C语言 内存
  • C语言动态内存管理深入探讨
    目录1.动态内存开辟的原因2.动态内存函数的介绍2.1malloc和free2.2calloc2.3realloc3.常见的动态内存错误3.1对NULL指针的解引用操作3.2对动态开...
    99+
    2024-04-02
  • C语言动态内存管理分析总结
    目录什么是动态内存分配动态内存函数的介绍freemalloccallocrealloc动态内存管理中常见的错误对NULL指针的解引用操作对动态开辟空间的越界访问对非动态开辟内存使用f...
    99+
    2024-04-02
  • 一文带你彻底搞懂Nginx反向代理
    一文带你彻底搞懂Nginx反向代理 一、什么是反向代理1.1 正向代理1.2 反向代理1.3 总结 二、配置反向代理2.1 准备 Tomcat2.2 配置 Nginx 一、什么是反...
    99+
    2023-09-20
    nginx 服务器 运维 shell 反向代理
  • 深入了解C语言的动态内存管理
    目录一、为什么会存在动态内存二、动态内存函数1.malloc和free2.calloc3.realloc三、动态内存函数常见错误2.对NULL指针进行解引用操作3.使用free释放一...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作