【C语言跬步积累】——动态内存管理

这篇具有很好参考价值的文章主要介绍了【C语言跬步积累】——动态内存管理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🌏博客主页:PH_modest的博客主页
🚩当前专栏:C语言跬步积累
💌其他专栏:
🔴 每日一题
🟡 每日反刍
🟢 读书笔记
🌈座右铭:广积粮,缓称王!

一.malloc和free

1.malloc

【C语言跬步积累】——动态内存管理

void* malloc(size_t size);

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

  • 如果开辟成功,则返回一个指向开辟好空间的指针
  • 如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。( 使用strerror(errno) 来获取错误信息 )
  • 返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定。 (强制类型转换
  • 如果参数 size为0,malloc的行为是标准是未定义的,取决于编译器
  • 申请空间的大小是以字节为单位

2.free

【C语言跬步积累】——动态内存管理

void free(void* ptr);

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

  • 如果参数 ptr 指向的空间不是动态开辟的,那free函数的行为是未定义的。
  • 如果参数 ptr 是NULL指针,则函数什么事都不做。
  • free并不会主动将接收的地址置为空,释放之后需要主动将地址置为空(即free(p); p = NULL;

3.应用

#include<stdio.h>
#include<string.h>//strerror的头文件
#include<stdlib.h>//malloc的头文件
#include<errno.h>//errno的头文件
int main()
{
	//申请
	int* p = (int*) malloc(20);
	if(*p == NULL)//申请内存空间太大的话会返回空指针
 	{
		printf("%s\n",strerror(errno));//反馈错误内容
		return 1;
 	}
 	//使用
 	int i = 0;
 	for(i = 0; i < 5; i ++)
 	{
 		p[i] = i + 1;
 		//*(p + i) = i + 1;
 		
 	}
 	for(i = 0; i < 5; i++)
 	{
 		printf("%d ",p[i]);
 	}
	//释放
	free(p);//释放p的内存
	p=NULL;//将p的内存置为空
	return 0;
}

二.calloc

【C语言跬步积累】——动态内存管理

void* calloc(size_t num, size_t size);
  • 函数的功能是为 num 个大小为 size 的元素开辟一块空间,并且把空间的每个字节初始化为0
  • 与函数 malloc 的区别只在于 calloc 会在返回地址之前把申请的空间的每个字节初始化为全0。

1.应用

#include<stdio.h>
#include<errno.h>
#include<string.h>
#include<stdlib.h>

int main()
{
	//申请
	int *arr = (int*)calloc(20, sizeof(int));
	if (arr == NULL)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}
	//使用
	int i = 0;
	for (i = 0; i < 5; i++)
	{
		*(arr + i) = i + 1;
	}
	for (i = 0; i < 5; i++)
	{
		printf("%d ", arr[i]);
	}
	//释放
	free(arr);
	arr = NULL;
	return 0;
}

2.calloc和malloc之间的特点

  • 参数不同
  • 都是在堆区上申请内存空间,但malloc不会将内存空间初始化为0,calloc会初始化为0,如果需要初始化为0就用calloc
  • 申请的内存是以字节为单位

三.realloc

【C语言跬步积累】——动态内存管理

1.知识点

void* realloc(void* ptr,size_t size);
  • ptr是要调整的内存地址
  • size 是调整之后新的大小
  • 返回值为调整之后的内存起始位置
  • 这个函数调整原内存空间大小的基础上,还会将原来内存中的数据移动到新的空间
  • realloc在调整内存空间的是存在两种情况:
    ①原有空间之后有足够大的空间:该情况要扩展内存就直接原有内存之后直接追加空间,原来空间的数据不发生变化
    ②原有空间之后没有足够大的空间:该情况的扩展方法是,在堆空间上另外找一个合适大小的连续空间来使用,这样函数返回的是一个新的内存地址

2.原理

【C语言跬步积累】——动态内存管理

  1. realloc会找一个更大的空间
  2. 将原来的数据拷贝到新空间内
  3. 释放旧空间
  4. 返回新空间的地址

注意

  1. ①中返回的是旧的地址二;②中返回的是新地址,使用realloc前后返回的地址不同
  2. realloc申请空间失败的话会返回空指针

3.应用

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>

int main()
{
	//申请
	int* p = (int*)malloc(20);
	if (p == NULL)
	{
		printf("%s\n", strerror(errno));
	}
	//使用
	int i = 0;
	for (i = 0; i < 5; i++)
	{
		p[i] = i + 1;
	}
	//申请空间
	int* str = (int*)realloc(p, 40);
	if (str != NULL)
	{
		p = str;
	}
	//使用
	for (i = 5; i < 10; i++)
	{
		p[i] = i + 1;
	}
	//释放
	free(p);
	p = NULL;
	return 0;
}

最后

本篇简单介绍了动态内存开辟需要用到的函数,下一篇会讲解动态内存中常见的错误,喜欢本专栏的可以点个订阅,让我们一起进步!文章来源地址https://www.toymoban.com/news/detail-416330.html

到了这里,关于【C语言跬步积累】——动态内存管理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • <C语言> 动态内存管理

    为什么存在动态内存分配? 上述的开辟空间的方式有两个特点: 空间开辟大小是固定的。 数组在声明的时候,必须指定数组的长度,它所需要的内存在编译时分配。 但是对于空间的需求,不仅仅是上述的情况。有时候我们需要的空间大小在程序运行的时候才能知道,那数组

    2024年02月15日
    浏览(34)
  • 【C语言】动态内存管理

    大家好,我是苏貝,本篇博客带大家了解动态内存管理,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️ 我们已经掌握的内存开辟方式有: int val = 20; 在栈空间上开辟四个字节 char arr[10] = {0}; 在栈空间上开辟10个字节的连续空间 但是上述的开辟空间的方式有

    2024年01月16日
    浏览(29)
  • 动态内存管理-c语言

    目录 1.为什么要有动态内存分配 2.malloc函数和free函数 malloc 函数原型 栗子 free 函数原型 栗子 3.calloc和***realloc*** 3.1calloc函数 原型如下: 栗子 3.2***recalloc*** 第一种情况 第二种情况 第三种情况 recalloc模拟实现calloc函数 4.六大常⻅的动态内存的错误 4.1对NULL指针的解引⽤操作

    2024年03月22日
    浏览(30)
  • C语言->动态内存管理

    文章目录  ✅作者简介:大家好,我是橘橙黄又青,一个想要与大家共同进步的男人😉😉 🍎个人主页:橘橙黄又青_C语言,函数,指针-CSDN博客 目的:学习malloc,free,calloc,realloc函数的使用。 内存函数在#includestdio.h头文件里面。 我们已经掌握的内存开辟⽅式有: 但是上述的

    2024年02月04日
    浏览(36)
  • c语言-动态内存管理

    1.我们一般的开辟空间方式: 2.这样开辟空间的特点 (1)申请的空间大小是固定的 (2)像数组那样一开始就要确定大小,一旦确定大小就不能改变了 3.动态内存 对于程序来说上述的内存申请是不能满足 因此为了能够对内存进行调整,C语言引入了动态内存开辟,让程序员自

    2024年02月04日
    浏览(27)
  • C语言:动态内存管理

    先点赞再观看哦! 学习数据结构之前,一定要对指针、结构体、动态内存管理进行深入学习! 小伙伴们可以看看博主之前的文章! 今天重点介绍动态内存开辟!十分重要哈! 我们已知的内存开辟方式有什么呢?? 但是上述开辟的空间有三个特点: 1、空间开辟的大小是固定

    2024年01月22日
    浏览(30)
  • 【C语言:动态内存管理】

    文章的标题是动态内存管理,那什么是动态内存管理?为什么有动态内存管理呢? 回顾一下以前学的知识,我们已经掌握的开辟内存的方式有以下几种: 上述开辟内存的方式有几个弊端: 开辟空间的大小是固定的 数组在声明的时候,必须指定数组的长度,数组空间⼀旦确定

    2024年02月03日
    浏览(29)
  • 进阶C语言-动态内存管理

    ✅截止目前,我们掌握的内存开辟的方式有: 但是上述的开辟空间的方式有两个特点: 空间开辟的大小是固定的。 数组在申明的时候,必须指定数组的长度,它所需的内存在编译时分配。 🔎但是对于空间的需求,不仅仅是上述的情况。有时候我们需要的空间大小在程序运

    2024年02月21日
    浏览(37)
  • 【C语言】动态内存管理详解

    目录 为什么存在动态内存分配 动态内存函数的介绍 malloc 和 free calloc realloc 常见的动态内存错误 对NULL指针的解引用操作 对动态开辟空间的越界访问 对非动态开辟内存使用free释放 使用free释放一块动态开辟内存的一部分 对同一块动态内存多次释放 动态开辟内存忘记释放(内

    2024年02月15日
    浏览(32)
  • 【进阶C语言】动态内存管理

    前言 📕作者简介: 热爱跑步的恒川 ,致力于 C/C++、Java、Python 等多编程语言,热爱跑步,喜爱音乐的一位博主。 📗本文收录于 C语言进阶 系列,本专栏主要内容为数据的存储、指针的进阶、字符串和内存函数的介绍、自定义类型结构、动态内存管理、文件操作等,持续更

    2023年04月18日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包