动态内存函数malloc,calloc,realloc详解

这篇具有很好参考价值的文章主要介绍了动态内存函数malloc,calloc,realloc详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🍍个人主页🍍:🔜勇敢的小牛儿🚩

🔱推荐专栏🔱:C语言知识点

⚠️座右铭⚠️:敢于尝试才有机会

🐒今日鸡汤🐒:出色一点 从能力到容貌

思维导图:

calloc malloc realloc,c语言知识点,开发语言,c语言,学习,函数

目录

思维导图:

一,malloc :

1.1:malloc函数简介:

1.2:malloc函数的使用:

 代码:

二,calloc函数

2.1calloc函数简介:

2.2calloc函数的使用:

2.3,calloc函数与malloc函数的不同点:

 三,realloc函数

3.1:realloc函数简介:

 3.2:realloc函数的使用:

4.使用动态内存时的典型错误 

4.1:对NULL进行解引用操作

4.2:越界访问

4.3:对非动态内存进行释放

 4.4:对一个动态内存进行多次释放

4.5释放部分动态内存 

4.6忘记对一个动态内存进行释放 

 4.7解决方案

结语:


 

一,malloc :

1.1:malloc函数简介:

1.作用:malloc函数是C语言内的一个开辟动态内存的函数,

              使用这个函数可以向系统申请一段连续可用的空间,

              并返回这块空间的起始地址。假如申请失败就返回一个NULL!!!

2.原型:void* malloc (size_t size);

3.善后:当你使用完这个函数申请的空间以后,要使用free()函数对申请到的空间进行释放。

1.2:malloc函数的使用:

第一步:使用malloc函数申请空间

1.包含头文件stdlib.h

2.调用函数malloc,调用时要记得需要强制类型转换一下。因为malloc的返回类型是void*。

3.判断是否为空指针,如果是空指针的话就表示空间申请不成功。因此使用strerror以及errno函数来打印错误提示信息。

4.使用就像数组那样使用。

5.使用完了以后就对申请到的空间进行释放,并将指针置为空指针。(防止出现野指针

 代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>//strerror函数的头文件
#include<errno.h>//errno的头文件
int main() {
	//申请空间
	int* p = (int*)malloc(20);//申请的空间的单位是字节,这里表示申请20个字节。
	//判断是否申请成功
	if (p == NULL) {
		printf("%s\n", strerror(errno));
		return;
	}
	//使用
	int i = 0;
	for (i = 0;i < 5;i++) {
		*(p+i) = i;
	}
	for (i = 0;i < 5;i++) {
		printf("%d ", *(p + i));
	}
	//善后
	free(p);
	p = NULL;
	return 0;
}

二,calloc函数

2.1calloc函数简介:

1.作用:向内存空间申请num个大小为sizeof大小的空间,并初始化为0。

                      申请成功就返回申请到的空间的地址,申请失败就返回NULL。

2.函数原型:void* calloc (size_t num, size_t size);

3.善后:使用完这块申请到的空间以后要对这块空间用free()进行释放

并将管理这块空间的指针置为空指针

2.2calloc函数的使用:

第一步:使用malloc函数申请空间

1.包含头文件stdlib.h

2.调用函数calloc,调用时要记得需要强制类型转换一下。因为calloc函数的返回类型是void*。

3.判断是否为空指针,如果是空指针的话就表示空间申请不成功。因此使用strerror以及errno函数来打印错误提示信息。

4.使用就像数组那样使用。

5.使用完了以后就对申请到的空间进行释放,并将指针置为空指针。(防止出现野指针

代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
int main() {
	//申请空间
	int* p = (int*)calloc(20,sizeof(int));//20表示申请空间的个数,
	                                     //sizeof(int)表示申请到的空间的大小。
	//判断是否申请成功
	if (p == NULL) {
		printf("%s\n", strerror(errno));//打印错误信息
		return;//结束
	}
	//使用
	int i = 0;
	for (i = 0;i < 5;i++) {
		*(p + i) = i;
	}
	for (i = 0;i < 5;i++) {
		printf("%d ", *(p + i));
	}
	//善后
	free(p);
	p = NULL;
	return 0;
}

2.3,calloc函数与malloc函数的不同点:

1.函数的参数不同,malloc函数只有一个参数但是calloc函数有两个参数。

void* malloc ( size_t size );  void* calloc ( size_t num , size_t size );
2.calloc函数有将申请到的空间初始化为0的功能,而malloc函数没有这个功能。

 三,realloc函数

3.1:realloc函数简介:

1. 作用:当malloc函数或者calloc函数申请的空间或者数组的空间

              不够大或太大时就可以用realloc函数对空间的大小进行调整。

2.函数原型:void* realloc (void* ptr, size_t size);

 3.2:realloc函数的使用:

1.包含头文件stdlib.h

2.调用realloc函数,因为函数的返回类型是void*型,

    所以我们需要强制类型转换一下来确定类型。

3.判断一下返回类型是否为空指针,非空才能对这个指针进行使用。

    是空指针那就打印一下错误信息(strerror(errno))。

4.realloc(NULL,20)==malloc(20)

代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
int main() {
	//申请空间
	int* p = (int*)calloc(20, sizeof(int));//20表示申请空间的个数,
										 //sizeof(int)表示申请到的空间的大小。
	//判断是否申请成功
	if (p == NULL) {
		printf("%s\n", strerror(errno));//打印错误信息
		return;//结束
	}
	//使用
	int i = 0;
	for (i = 0;i < 5;i++) {
		*(p + i) = i;
	}
	int* ptr = (int*)realloc(p, 40);//将p指向的20个字节的空间改为40个字节的空间
	if (ptr != NULL) {//验货
		p = ptr;
		for (i = 5;i < 10;i++) {
			*(p + i) = i;
		}
		for (i = 0;i < 10;i++) {
			printf("%d ", p[i]);
		}
	}
	else {
		printf("realloc:%s\n", strerror(errno));
	}
	//善后
	free(p);
	p = NULL;
	return 0;
}

3.2.1:realloc函数在成功使用时的两种情况:

3.2.1.1:返回旧地址:

当内存空间有足够的空间可以申请时,并且其它地址不会与我要申请的空间冲突时:返回旧地址

calloc malloc realloc,c语言知识点,开发语言,c语言,学习,函数

 

 3.2.1.2:返回新地址:

当内存空间足够,但是其它被申请的空间与我要申请的空间冲突时:返回新地址

calloc malloc realloc,c语言知识点,开发语言,c语言,学习,函数

 

4.使用动态内存时的典型错误 

4.1:对NULL进行解引用操作

不能对空指针进行解引用操作

int main() {
	int* p = (int*)malloc(4);//返回值可能是NULL
	*p = 20;
	printf("%d\n", *p);//对NULL解引用操作会报错
	return 0;
}

4.2:越界访问

int main() {
	int* p = (int*)malloc(4);//返回值可能是NULL
	if (p != NULL) {//判断不为NULL才执行赋值操作,除去第一种错误的可能
	*p = 20;
	*(p + 1) = 30;//越界访问
	printf("%d %d\n", *p,*(p+1));
	}
	free(p);
	p = NULL;
	return 0;
}

4.3:对非动态内存进行释放

对一个非堆区的空间进行释放是不行的

int main() {
	int a[20] = { 0 };//a只是一个数组,存放在栈区
	int* p = a;
	free(p);//释放p指向的内存空间即释放a数组的空间
	return 0;
}

 4.4:对一个动态内存进行多次释放

因为 在第一次对p进行释放以后,p已经变成一个野指针,再次释放肯定会出现问题的。

int main() {
	int* p = (int*)malloc(20);
	if (p != NULL) {
	int i = 0;
	for (i = 0;i < 5;i++) {
		*(p + i) = i;
	}
	for (i = 0;i < 5;i++) {
		printf("%d ", *(p + i));
	}
	free(p);//第一次释放
	}
	free(p);//第二次释放
	p = NULL;
	return 0;
}

4.5释放部分动态内存 

对动态内存进行释放的时候要提供动态内存的起始地址,否则就无法进行释放。

int main() {
	int* p = (int*)malloc(40);
	if (p == NULL) {
		printf("%s\n", strerror(errno));
		return;
	}
	int i = 0;
	for (i = 0;i < 5;i++) {
		*p++ = i;//p++的现象导致p指向的空间发生了变化
	}
	free(p);//对部分动态内存进行释放
	p = NULL;
	return 0;
}
		

4.6忘记对一个动态内存进行释放 

忘记对一段动态内存空间进行释放时会发生内存泄漏。虽然发生这个错误以后你的代码还是能够跑起来,但是会导致你的电脑变得卡顿。

int main() {
	int* p = (int*)malloc(20);
	if (p == NULL) {
		printf("%s\n", strerror(errno));
		return;
	}
	int i = 0;
	for (i = 0;i < 5;i++) {
		*(p+i) = i;
	}
	for (i = 0;i < 5;i++) {
		printf("%d ", *(p + i));
	}
	//没有free(p)释放内存
	return 0;
}

 4.7解决方案

1.使用开辟空间得到的地址时先判断一下是否为空指针再使用(避免对NULL进行使用)

2.使用时不要改变p指针的指向.(避免free时出现错误)

3.使用完成以后要对动态内存空间进行释放以及让释放以后的指针指向NULL.(避免出现内存泄漏和野指针

4.不要对动态内存进行多次释放。也不要对不是动态内存的空间进行释放。(避免free一段已释放的空间以及对不是动态内存的空间进行释放

代码:

int main() {
	//申请空间
	int* p = (int*)malloc(20);
	//判断是否为NULL
	if (p == NULL) {
		printf("%s\n", strerror(errno));
		return;
	}
	//使用(p不是NULL时才使用)
	int i = 0;
	for (i = 0;i < 5;i++) {
		*(p + i) = i;//不改变p原来的指向
	}
	for (i = 0;i < 5;i++) {
		printf("%d ", *(p + i));
	}
	//善后
	free(p);//释放,避免内存泄漏
	p = NULL;//置为空指针,避免野指针的出现
	return 0;
}

结语:

小牛儿今天的分享就到这里了。文章来源地址https://www.toymoban.com/news/detail-762673.html

到了这里,关于动态内存函数malloc,calloc,realloc详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 动态内存malloc,calloc,realloc如何使用,使用场景及使用free释放内存时崩溃的原因

    目录 1.内存区域 2.void与void* 3.应用场景 4.malloc 5.calloc 6.realloc 7.free崩溃的原因 7.1引入 7.2具体原因 7.2.1越界 7.2.2指针移动 7.2.3重复释放同一段内存 局部变量 : 定义在函数内部的变量 , 包括形参 , 在栈 (stack) 中 , 作用域在函数内部有效 , 生存周期 : 进入函数创建, 退出函数销毁。

    2024年02月05日
    浏览(57)
  • 动态内存分配:malloc、calloc、realloc(超详解析,多维度分析,小白一看就懂!!!!)

    目录 一、前言 二、动态内存的简单介绍 🍉什么是动态内存分配 🍎为什么要使用动态内存分配  三、动态内存函数的介绍和拓展  🍋malloc()函数  🍊free()函数  🍌calloc()函数 🍇realloc()函数 四、常见动态内存分配的错误 五、共勉 在学习 动态内存分配 时,感觉这些动态分

    2024年02月05日
    浏览(45)
  • calloc、malloc、realloc函数的区别及用法

    三者都是分配内存,都是stdlib.h库里的函数,但是也存在一些差异。 (1)malloc函数。其原型void *malloc(unsigned int num_bytes); num_byte为要申请的空间大小,需要我们手动的去计算,如int *p = (int )malloc(20 sizeof(int)),如果编译器默认int为4字节存储的话,那么计算结果是80Byte,一次申请

    2024年02月08日
    浏览(45)
  • 如何实现动态分配,malloc,realloc,calloc的使用方法,数组,链表,结构体实现动态分配(含代码实现)

    🎊【数据结构与算法】专题正在持续更新中,各种数据结构的创建原理与运用✨,经典算法的解析✨都在这儿,欢迎大家前往订阅本专题,获取更多详细信息哦🎏🎏🎏 🪔本系列专栏 -  数据结构与算法_勾栏听曲_0 🍻欢迎大家  🏹  点赞👍  评论📨  收藏⭐️ 📌个人主

    2023年04月27日
    浏览(43)
  • C语言 malloc动态内存分配函数

    malloc函数:malloc时动态内存分配函数,用于申请一块连续的指定大小的内存块区域以void*类型返回分配的内存区域地址,就是当数组创建长度不一定 害怕数据存储不够或者不能浪费时间 在使用malloc开辟空间时,使用完成一定要释放空间,如果不释放会造内存泄漏。n在使用ma

    2024年02月07日
    浏览(45)
  • C++与C语言动态内存管理的不同 new与malloc

      目录 1.C语言动态内存管理方式 2.C++中动态内存管理 2.1 new和delete操作内置类型 2.2 new和delete操作自定类型 2.3 为什么delete要带[ ]  3.new申请空间失败 4.operator new 与 operator delete 函数 5.new与delete的是实现原理 5.1 内置类型 5.2 自定义类型 6.定位new表达式(了解即可) 7.malloc/free和

    2024年02月08日
    浏览(41)
  • 【C语言】free()函数详解(动态内存释放函数)

    🦄 个人主页 :修修修也 🎏 所属专栏 :C语言 ⚙️ 操作环境 : Visual Studio 2022 目录  一.free()函数简介 1.函数功能 2.函数参数 void * ptr 3.函数返回值 4.函数头文件 二.free()函数的具体使用 1.使用free()函数完成malloc()开辟空间的释放 2.使用free()函数完成calloc()开辟空间的释放 3.使用

    2024年02月08日
    浏览(38)
  • C语言malloc函数详解(通俗易懂)

    简单来说,malloc函数的作用是开辟一个空间来给你使用; 他包含在标准库中 返回值是一个void*(可以简单理解为一个没人知道它是什么类型的指针),一般我们都要对结果进行类型转换; 我们通过malloc申请的空间是以字节为单位的,如malloc(1*1024*1024)则申请了1MB的空间; 如果

    2023年04月08日
    浏览(50)
  • C语言 — 动态内存管理(动态内存函数)

    本期分为三篇介绍动态内存管理相关内容,关注博主了解更多 博主博客链接:https://blog.csdn.net/m0_74014525 本期介绍动态内存函数,函数如何使用、函数格式、在使用在所需要的注意点及C/C++程序的内存开辟区域 第一篇:C语言 — 动态内存管理(动态内存函数) 第二篇:C语言

    2024年02月14日
    浏览(47)
  • 【C语言】动态内存函数介绍

    目录 1.malloc和free 2.calloc 3.realloc   C语言提供了一个动态内存开辟的函数malloc: 这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。 ✔如果开辟成功,则返回一个指向开辟好空间的指针。 ✔如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做

    2024年01月22日
    浏览(34)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包