C语言初识动态内存管理malloc calloc realloc free函数

目录
  • 一、为什么存在动态内存分配
  • 二、动态内存函数的使用
    • 1.malloc函数
      • (1)malloc的定义
      • (2)malloc函数的注意事项
      • (3)malloc函数的使用
    • 2.calloc函数
      • (1)calloc函数的定义
      • (2)calloc函数的注意事项
      • (3)calloc函数的使用
    • 3.realloc函数
      • (1)realloc函数的定义
      • (2)realloc函数的注意事项
      • (3)realloc函数的使用
  • 总结

一、为什么存在动态内存分配

在c语言中我们目前掌握的内存开辟方式有:

int val = 20;//在栈空间上开辟四个字节
char arr[10] = {0};//在栈空间上开辟10个字节的连续空间

要么创建个变量,要么创建个数组。
这样开辟出来的空间我们在使用的时候有时候会出现要么感觉空间过大,要么感觉空间过小,不够灵活。
所以我们需要一种使空间可以变大变小的方法,这时候就出现了动态内存开辟。

但是上述的开辟空间的方式有两个特点:

1. 空间开辟大小是固定的。

2. 数组在申明的时候,必须指定数组的长度,它所需要的内存在编译时分配。 但是对于空间的需求,不仅仅是上述的情况。有时候我们需要的空间大小在程序运行的时候才能知道, 那数组的编译时开辟空间的方式就不能满足了。 这时候就只能试试动态存开辟了。

二、动态内存函数的使用

首先我们要了解数据,变量,函数是在内存中怎么存放的,如下图所示:

1.malloc函数

(1)malloc的定义

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

(2)malloc函数的注意事项

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

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

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

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

(3)malloc函数的使用

代码如下:

#include<stdio.h>

//动态内存开辟
int main()
{
	//假设开十个整型的空间 -- 10*sizeof(int)
	int arr[10];//栈区
	//动态内存开辟
	int* p = (int*)malloc(10 * sizeof(int));
	//使用这些空间的时候
	if (p == NULL)
	{
		perror("main");//main:xxxxxxxxxxx(错误信息)
	}
	//使用
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		*(p + i) = i;
	}
	for (i = 0; i < 10; i++)
	{
		printf("%d", p[i]);//p[i]-->*(p + i)
	}
	//回收空间
	free(p);//malloc函数要配合free函数使用,使用完之后要主动释放这块空间
	p = NULL;//释放完了之后要把p置成空指针
	return 0;
}

2.calloc函数

(1)calloc函数的定义

C语言还提供了一个函数叫 calloc , calloc 函数也用来动态内存分配。

(2)calloc函数的注意事项

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

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

(3)calloc函数的使用

代码如下:

#include<stdio.h>

//动态内存开辟
int main()
{

	int* p = calloc(10,sizeof(int));
	//使用这些空间的时候
	if (p == NULL)
	{
		return 1;
	}
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d", p[i]);//p[i]-->*(p + i)
	}
	//回收空间
	free(p);//malloc函数要配合free函数使用,使用完之后要主动释放这块空间
	p = NULL;//释放完了之后要把p置成空指针
	return 0;
}

打印结果如下:

需要注意点就是,calloc函数和malloc函数相比有两点不同,

1.calloc函数的参数为两个,malloc函数的参数为一个。 

2.malloc函数如果不初始化打印出来的都是随机值,calloc函数不用初始化,会默认把申请的空间每个字节初始化为0。

3.realloc函数

(1)realloc函数的定义

realloc函数的出现让动态内存管理更加灵活。

有时会我们发现过去申请的空间太小了,有时候我们又会觉得申请的空间过大了,那为了合理的时 候内存,我们一定会对内存的大小做灵活的调整。

那 realloc 函数就可以做到对动态开辟内存大小 的调整。

(2)realloc函数的注意事项

1.ptr 是要调整的内存地址

2.size 调整之后新大小 返回值为调整之后的内存起始位置。

3.这个函数调整原内存空间大小的基础上,还会将原来内存中的数据移动到 新 的空间。

4.realloc在调整内存空间的是存在两种情况:

情况1 当是情况1 的时候,要扩展内存就直接原有内存之后直接追加空间,原来空间的数据不发生变化。

情况2 当是情况2 的时候,原有空间之后没有足够多的空间时,扩展的方法是:在堆空间上另找一个合适大小 的连续空间来使用。这样函数返回的是一个新的内存地址。 由于上述的两种情况,realloc函数的使用就要注意一些。

(3)realloc函数的使用

#include<stdio.h>

//动态内存开辟
int main()
{

	int* p = calloc(10,sizeof(int));
	//使用这些空间的时候
	if (p == NULL)
	{
		perror("main");
		return 1;
	}
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		*(p + i) = 5;
	}//这里需要P指向的空间更大,需要20个int空间的大小
	//realloc调整空间大小
	int* ptr = realloc(p, 20 * sizeof(int*));
	if (ptr != NULL)
	{
		p = ptr;
	}
	//回收空间
	free(p);//malloc函数要配合free函数使用,使用完之后要主动释放这块空间
	p = NULL;//释放完了之后要把p置成空指针
	return 0;
}

总结

本文仅仅简单的介绍了动态内存函数的定义,注意事项和使用,还有free函数用来释放动态内存开辟的空间,然后置为空。文章如果有任何问题,欢迎大佬提出疑问。我会虚心学习和改正,最重要的是能共同进步,共同成长,学好编程。

到此这篇关于C语言初识动态内存管理malloc calloc realloc free函数的文章就介绍到这了,更多相关C语言 动态内存管理内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言动态内存管理的实现

    目录 1. 摘要 2. 为什么存在动态内存管理 3. 动态内存函数 3.1 malloc 3.2 free 3.3 calloc 3.4 realloc 4. 常见的动态内存错误 5. 几个经典笔试题 参考答案 6. 参考文献 1. 摘要 本文主要详解C语言中的动态内存分配 2. 为什么存在动态内存管理 我们先来看一段变量的声明: double x = 1.000000; char str[] = "abcdef"; 好的,上述变量的声明有何特点呢? 请思考一下,我的朋友. 对,没错,

  • C语言动态内存管理分析总结

    目录 什么是动态内存分配 动态内存函数的介绍 free malloc calloc realloc 动态内存管理中常见的错误 对NULL指针的解引用操作 对动态开辟空间的越界访问 对非动态开辟内存使用free释放 使用free释放一块动态开辟内存的一部分 对同一块动态内存多次释放 动态开辟内存忘记释放(内存泄漏) 一些经典的笔试题 题目1 题目2 题目3 题目4 柔性数组 柔性数组的特点 柔性数组的优势 什么是动态内存分配 我们都知道在C语言中,定义变量的时候,系统就会为这个变量分配内存空间,而

  • C语言 动态内存管理全面解析

    目录 1. 为什么存在动态内存分配 2. 动态内存函数的介绍 2.1 malloc和free 2.2 calloc 2.3 realloc 3. 常见的动态内存错误 3.1 对NULL指针的解引用操作 3.2 对动态开辟空间的越界访问 3.3 对非动态开辟内存使用free释放 3.4 使用free释放一块动态开辟内存的一部分 3.5 对同一块动态内存多次释放 1. 为什么存在动态内存分配 *动态内存开辟在堆区* 我们已经掌握的开辟内存方式是类型直接定义变量,开辟的内存是固定的,像: int a=

  • C语言动态内存管理介绍

    目录 前言: C 语言为内存的分配和管理提供了几个函数: 1.malloc() 用法 2.calloc() 用法 3.realloc() 与 free() 用法 前言: 简单记录一下,内存管理函数 为什么使用动态内存呢? 简单理解就是可以最大限度调用内存 用多少生成多少,不用时就释放而静止内存不能释放 动态可避免运行大程序导致内存溢出 C 语言为内存的分配和管理提供了几个函数: 头文件:<stdlib.h> 注意:void * 类型表示未确定类型的指针  1.malloc() 用法  分配一块

  • 关于C语言动态内存管理介绍

    目录 1.为什么需要动态内存分配 2.有关动态内存函数介绍 2.1 malloc和free 2.2 calloc函数 2.3 realloc函数 3. 常见的动态内存错误 3.1 对NULL指针进行解引用操作 3.2 对动态开辟空间的越界访问 3.3 对非动态开辟内存使用free释放 3.4 使用free释放一块动态开辟内存的一部分 3.5 对同一块动态内存多次释放 3.6 动态开辟内存忘记释放(内存泄漏) 总结 1.为什么需要动态内存分配 关于这个问题,我们先看看我们之前是如何开辟内存的. i

  • C语言的动态内存管理的深入了解

    目录 一.动态内存分配 二.动态内存分配函数 1.malloc() 2.realloc() 3.calloc() 三.用free函数释放内存 四.迷途指针 总结 一.动态内存分配 (1)用malloc类的函数分配内存: (2)用这些内存支持应用程序: (3)用free函数释放内存. 内存的简答来说的三大操作:分配----使用----释放 内存管理指的是:分配— ----释放 我们编写的程序代码:使用 程序本质上就是处理数据,数据信息需要存放在内存里,就是用二极管表示的开断表示二进制数,进一步用二

  • 详解C语言之动态内存管理

    目录 开辟动态内存的函数 释放开辟的动态内存空间的函数 错误信息函数 具体使用例: 常见的动态内存错误 总结 先来了解一下动态管理内存所需用到的函数 开辟动态内存的函数 1.malloc函数:void* malloc(size_t size); 功能:开辟一块大小为size单位为字节的动态空间.若开辟成功返回函数开辟空间的无类型指针,若开辟失败则返回空指针NULL 2.calloc函数: void* calloc(size_t num, size_t size); 功能:开辟一块能容纳下num个

  • C语言初识动态内存管理malloc calloc realloc free函数

    目录 一.为什么存在动态内存分配 二.动态内存函数的使用 1.malloc函数 (1)malloc的定义 (2)malloc函数的注意事项 (3)malloc函数的使用 2.calloc函数 (1)calloc函数的定义 (2)calloc函数的注意事项 (3)calloc函数的使用 3.realloc函数 (1)realloc函数的定义 (2)realloc函数的注意事项 (3)realloc函数的使用 总结 一.为什么存在动态内存分配 在c语言中我们目前掌握的内存开辟方式有: int val

  • C语言中动态内存分配malloc、calloc和realloc函数解析

    目录 前言 free函数 malloc函数 calloc函数 realloc函数 扩充 malloc/calloc/realloc区别总结 总结 前言 有时候我们需要的空间大小不确定,需要随着程序需要的空间而变化, 那以数组开辟的固定大小的空间就不适用了, 这时候我们就需要动态分配开辟空间了.当空间不够时就扩容.动态开辟是在堆区开辟一块连续可用空间,并返回这块空间的地址.有三种函数malloc, calloc和realloc.我们动态内存分配就在堆区开辟空间 上面的四个区只有堆区的空间是需要手动

  • C语言动态内存管理malloc柔性数组示例详解

    目录 1.1为什么存在动态内存管理 1.2动态内存管理函数 1.2.1malloc 1.2.2free 1.2.3calloc 1.2.4realloc 1.3动态内存管理函数易错点 1.3.1对NULL指针的解引用操作 1.3.2对动态开辟空间的越界访问 1.3.3对非动态开辟内存使用free释放 1.3.4使用free释放一块动态开辟内存的一部分 1.3.5对同一块动态内存多次释放 1.3.6动态开辟内存忘记释放(内存泄漏) 2.1常见相关笔试题 2.2C/C++语言中的内存开辟 2.3柔性

  • C语言中动态内存管理图文详解

    目录 1.动态内存开辟的原因 2.动态内存函数的介绍 2.1malloc和free 2.2calloc 2.3realloc 3.常见的动态内存错误 3.1对NULL指针的解引用操作 3.2对动态开辟空间的越界访问 3.3对非动态开辟内存使用free 3.4使用释放一块动态开辟内存的一部分 3.5对同一块动态内存多次释放 3.6动态开辟内存忘记释放(内存泄漏) 4.练习 4.1练习1 4.1练习2 4.3练习3 4.4练习4 5.C/C++程序的内存开辟 总结 1.动态内存开辟的原因 常见的内存

  • 深入了解C语言的动态内存管理

    目录 一.为什么会存在动态内存 二.动态内存函数 1.malloc和free 2.calloc 3.realloc 三.动态内存函数常见错误 2.对NULL指针进行解引用操作 3.使用free释放一块动态开辟内存的一部分 4.对静态内存进行free释放 5.对同一内存空间多次释放 6.动态开辟空间忘记释放 四.经典笔试题 1.笔试1 2.笔试2 3.笔试3 总结 一.为什么会存在动态内存 int data=20;//在栈空间上开辟4个字节空间 char ch[5]={0};//在栈开辟5个字节连

  • 详解C语言中动态内存管理及柔性数组的使用

    目录 一.malloc 二.free 三.calloc 四.realloc 1.realloc在扩容时的情况 2.realloc也能实现malloc功能 五.使用动态内存的常见错误 1.free空指针 2.对动态开辟的空间越界访问 3.对非动态开辟内容free 4.只free动态开辟空间的一部分 5.对同一块内存多次free 6.动态内存空间忘记释放(内存泄漏) 六.柔性数组 1.柔性数组的概念 2.柔性数组的特点 3.柔性数组的使用场景 4.柔性数组的优点 一.malloc 这个函数向堆区申请

  • C语言的动态内存管理你了解吗

    目录 C/C++内存分配方式 C++内存管理方式 new和delete的使用 new和delete的骚操作 new和delete的区别 重载new和delete 定位new表达式 内存泄露 总结 C/C++内存分配方式 在学习C语言阶段的时候,创建一个变量,编译器会为它分配一块内存.而创建一个C++对象的时候,编译器会为这个对象分配内存,并且调用合适的构造函数进行初始化. 那么编译器的内存分配方式是怎样的呢? 内存分配可以有以下的几种方式 从静态存储区分配.这样的分配方式在程序开始前就可以为对象

  • 一文带你了解C语言中的动态内存管理函数

    目录 1.什么是动态内存管理 2.为什么要有动态内存管理 3.如何进行动态内存管理 3.1 malloc 3.2 free 3.3 calloc 3.4 realloc 总结 1.什么是动态内存管理 平时我们写代码,一种非常常见的写法是: int a = 0; // 创建一个变量 int arr[10] = {0}; // 创建一个数组 当你创建变量a的时候,其实是向内存中申请了4个字节的空间来存放一个整数.而当你创建数组arr的时候,是向内存中申请了40个字节的空间来存放10个整数.当你这么写

随机推荐