服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - 深入了解C语言中的动态内存分配

深入了解C语言中的动态内存分配

2023-02-15 16:16。菀枯。 C/C++

这篇文章主要为大家详细介绍了C语言中的动态内存分配,文中的示例代码讲解详细,对我们学习C语言有一定的帮助,需要的可以参考一下

今天我们来学习一下C语言中的动态内存分配 开始学习吧

深入了解C语言中的动态内存分配

 

什么是动态内存分配

我们目前已经知道的内存开辟的方式有:

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

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

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

2.数组在申明的时候,必须指定数组长度,它所需内存在编译时分配。

显然,这样无法满足有些场景的要求,有时我们所需要的空间大小只有在程序运行的时候才知道。这时我们就需要用到动态内存分配了。

 

如何进行动态内存分配

首先我要介绍两个函数 malloc 和 free

void* malloc(size_t size);

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

  • 如果开辟成功,则返回一个指向开辟好空间的指针。
  • 如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。
  • 返回值的类型是void*,所以malloc函数并不知道开辟空间的类型,具体在使用的时候由使用者来决定
  • 如果参数size为0,malloc的行为是标准未定义的,取决于编译器。

现在我们知道了如何去开辟空间,接下来,我们去学习一下如何将开辟的空间释放掉。

void free(void* ptr);

C语言提供了另外一个函数free是专门用来释放动态内存的

  • 如果参数ptr指向的空间不是动态内存开辟的,那么free的行为是未定义的。
  • 如果参数ptr是NULL指针,那么函数什么都不会做。

想使用malloc 和 free 都需要引入一个头文件<stdlib.h>

接下来让我们看个示例:

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

int main()
{
  int num = 0;
  scanf("%d", &num);
  int *ptr = (int*)malloc(sizeof(int) * num);
  //判断是否开辟成功
  if(NULL != ptr)
  {
      int i = 0;
      for(i = 0; i < num; i++)
      {
          *(ptr + i) = 0;
      }
  }
  free(ptr);//释放空间
  ptr = NULL;
  return 0;
}

第二个开辟空间的动态内存分配的函数 calloc

void* calloc(size_t num, size_t size);

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

malloc与calloc的区别在于calloc会在返回地址之前把申请的空间的每个字节都初始化为0

举个例子:

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

int main()
{
  int *p = (int*)calloc(10, sizeof(int));
  if(NULL != p)
  {
      int i = 0;
      for(i = 0; i < 10; i++)
      {
          *(ptr + i) = 0;
      }
  }
  free(p);
  p = NULL;
  retrun 0;
}

深入了解C语言中的动态内存分配

所以如果我们对申请的内存空间的内容要求初始化,那么可以很方便的使用calloc函数来完成任务。

大小修改函数realloc

有时候我们会发现之前申请的空间太小,有时又会觉得申请的空间过大,那为了合理的使用内存,我们一定会对内存的大小做灵活调整。realloch函数就可以对动态开辟的内存大小进行调整

void* realloc(void* ptr, size_t size);
  • ptr 是要调整的内存地址
  • size 调整之后的新大小
  • realloc在调整内存空间后的返回值有两种情况

情况一:原有空间之后有足够大的空间,要扩展内存就直接在原有内存之后追加空间,原有空间的数据不变。

情况二:原有空间之后无足够大的空间,扩展方法是在堆上另找一块连续的空间来使用,这样函数返回的就是一个新的内存地址

深入了解C语言中的动态内存分配

以上就是深入了解C语言中的动态内存分配的详细内容,更多关于C语言 动态内存分配的资料请关注服务器之家其它相关文章!

原文链接:https://blog.csdn.net/m0_60447315/article/details/123152185

延伸 · 阅读

精彩推荐
  • C/C++C语言使用openSSL库AES模块实现加密功能详解

    C语言使用openSSL库AES模块实现加密功能详解

    这篇文章主要介绍了C语言使用openSSL库AES模块实现加密功能,详细分析了C语言加密的相关概念、原理及AES模块加密具体实现技巧,需要的朋友可以参考下...

    erlang_hell7822021-05-12
  • C/C++C语言版三子棋游戏

    C语言版三子棋游戏

    这篇文章主要为大家详细介绍了C语言版三子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    LUYAO_LY6502021-12-09
  • C/C++C++编写实现飞机大战

    C++编写实现飞机大战

    这篇文章主要为大家详细介绍了C++编写实现飞机大战,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    1coder.4392022-12-20
  • C/C++C++详细讲解图论的基础与图的储存

    C++详细讲解图论的基础与图的储存

    图论〔Graph Theory〕是数学的一个分支。它以图为研究对象。图论中的图是由若干给定的点及连接两点的线所构成的图形,这种图形通常用来描述某些事物之...

    quicklsleap4882022-12-12
  • C/C++用C语言来实现一个简单的虚拟机

    用C语言来实现一个简单的虚拟机

    这篇文章主要介绍了用C语言来实现一个简单的虚拟机,其中栈数组的部分非常值得学习,需要的朋友可以参考下...

    C语言教程网4892021-03-02
  • C/C++C++实现教职工信息管理系统课程设计

    C++实现教职工信息管理系统课程设计

    这篇文章主要为大家详细介绍了C++实现教职工信息管理系统课程设计,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一...

    甜甜甜欣7602022-10-25
  • C/C++C/C++实现经典象棋游戏的示例代码

    C/C++实现经典象棋游戏的示例代码

    中国象棋是起源于中国的一种棋,属于二人对抗性游戏的一种,在中国有着悠久的历史。本文将利用C++实现这一经典游戏,快跟随小编一起学习一下吧...

    风光无限,未必快乐10112022-12-14
  • C/C++从汇编看c++中的多态详解

    从汇编看c++中的多态详解

    下面小编就为大家带来一篇从汇编看c++中的多态详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    C++教程网9652021-04-07