美文网首页
C、C++ 动态分配内存 malloc calloc reall

C、C++ 动态分配内存 malloc calloc reall

作者: Kael_Zhang的安卓笔记 | 来源:发表于2023-06-28 15:38 被阅读0次

为什么动态分配内存?

int a[5]; //ok
int length = 5;
int a[length];  //不ok
  • 数组的长度必须事先指定,而且只能是常量,不能是变量
  • 因为数组长度只能是常量,所以它的长度不能在函数运行的过程当中动态地扩充和缩小
  • 对于数组所占内存空间无法手动释放,只能在函数运行结束后由系统自动释放,所以在一个函数中定义的数组只能在该函数运行期间被使用
  • 动态分配内存就不存在以上问题,因为动态内存是手动释放,理论上可以在任意时刻释放,在释放之前,即便是函数运行结束,其他函数仍可继续使用它。(程序运行结束时系统为该程序分配的所有内存空间都会被释放)

动态分配内存的使用

  • 动态分配内存主要涉及到 malloc calloc realloc 三个函数
  • 动态分配内存必须指针接收
  • 动态分配内存返回类型为 void *
  • 动态分配内存可能失败 返回NULL ,使用前应判空
  • 动态分配的内存不会自动释放,必须手动释放
  • malloc ,分配内存
int *p = (int *)malloc(10); //动态申请10个字节的大小的连续空间,返回的是首地址
  • calloc,分配内存并初始化为0,
int *p = (int *)calloc(10,2); //动态申请 10*2 个字节的大小的连续空间,并初始化为0,返回的是首地址
  • realloc,动态调整已分配的内存,返回调整后的新分配的连续空间的首地址,同时将调整之前的地址中的值复制到新地址中
int *p = (int *)malloc(20 * sizeof(int));
int *p1 = (int *)realloc(p, 10*sizeof(int)); 
//扩大已分配的内存,返回已扩大后的新分配的连续空间的首地址,同时将扩大之前的地址中的值复制到新地址中

动态分配内存的释放

  • 动态分配的内存不会自动释放,必须手动释放
# include <stdio.h>
# include <stdlib.h>
int main(void)
{
    int *p = malloc(sizeof(int));
    *p = 10;
    printf("p = %p\n", p);
    free(p);
    printf("p = %p\n", p);
    p = NULL;
    return 0;
}

释放前后,p 所指向的内存地址是一样的。所以释放后 p 所指向的仍然是那块内存空间。既然指向的仍然是那块内存空间,那么就仍然可以往里面写数据。可是释放后该内存空间已经不属于它了,该内存空间可能会被分配给其他变量使用。如果其他变量在里面存放了值,而现在用 p 往里面写入数据就会把那个值给覆盖,这样就会造成程序错误。所以当指针变量被释放后,要立刻把它的指向改为 NULL。

  • 只有动态创建的内存才能用 free 把它释放掉,静态内存是不能用free释放的。静态内存只能由系统释放

相关文章

  • 函数

    内置函数 malloc|calloc(动态分配内存) 区别:malloc一般需要强制转换,calloc不需要。ca...

  • 前端实战篇-聊聊JavaScript内存

    C、C++语言需要手动管理内存的分配与释放(常用方法:malloc(), calloc(), realloc()和...

  • C\C++ 中 malloc、calloc、realloc 函数

    前言 C\C++提供了底层的内存操作,为程序提供了强大的能力。在使用 malloc() calloc() real...

  • 第11章:动态内存分配

    为什么使用动态内存分配 malloc和free calloc和realloc 使用动态分配的内存 常见的动态内存错...

  • C 内存管理

    C里比较重要的东西, 一个是指针,另外一个应该就是内存了。 四种方法1.malloc2.calloc3.reall...

  • malloc与calloc

    函数malloc()和calloc()都可以用来动态分配内存空间,但两者稍有区别。

  • C语言的malloc

    为什么C语言要有malloc malloc就是memory allocate动态分配内存,malloc的出现时为了...

  • C++———动态内存分配

    动态内存分配用于提高内存的利用率,在c语言中使用malloc内置函数动态分配内存,而在c++中使用new运算符进行...

  • malloc和New的区别

    1、malloc/free是c中的一个函数,new/delet是c++中的操作符,都是动态分配内存 2、void ...

  • 阅读游戏引擎架构

    通过malloc()/free()或C++的全局new/delete运算符动态分配内存——又称为堆分配——通常是非...

网友评论

      本文标题:C、C++ 动态分配内存 malloc calloc reall

      本文链接:https://www.haomeiwen.com/subject/oemoydtx.html