当前位置:   article > 正文

c语言中的动态内存_动态存储c语言

动态存储c语言

目录

一、什么是动态内存

二、动态内存分配函数  

1.malloc向堆区申请一块指定大小的内存空间

2.free

3.calloc分配并使用0初始化内存空间

4.realloc函数扩容

一、什么是动态内存

我们的程序对象存储的位置有静态内存和动态内存还有栈内存,静态内存里存储着局部static对象,类的static数据成员以及定义在任何类外的变量,栈内存里保存着定义在函数内的非static对象,分配在静态内存或栈内存中的对象有着严格的生存期,由编译器自动生成和销毁。但有时我们需要在程序运行时动态分配对象,这个时候就需要用到动态内存了,动态内存的生存期由程序来控制,也就是说,我们必须在使用完程序后释放这部分内存,否则就会造成内存泄漏。

二、动态内存分配函数  

c语言中动态内存管理的有四个函数:malloc,calloc,free,realloc。使用它们都需要引用<stdio.h>或<malloc.h>头文件。

1.malloc向堆区申请一块指定大小的内存空间

使用格式:void*malloc(size_t)size_t 要开辟的字节数 

例如:

int* p=malloc(40);

上诉代码指的是开辟一个40个字节的空间。

注意:如果我们开辟的空间太大,我们是开辟不出来的。因为在Windows系统中堆区的大小大概在1.5~1.9GB 。

2.free

由于堆区和栈区不同,在开辟一个空间后,如果使用过后不去把他释放掉,那它会一直存在那里,别人也无法使用。

当我们free掉内存空间后,p仍旧指向这片空间,要是我们不小心再次使用,就会发生非法访问,所以此时就要将指针变量指向NULL。

注意:以下三种情况使用free可能使函数崩掉

1.连续多次释放

  1. int* p=malloc(100);
  2. free(p);
  3. free(p);

2.free(野指针); 

3.free栈上的空间

  1. int a=0;
  2. int* p=&a;
  3. free(p);

3.calloc分配并使用0初始化内存空间

calloc函数和malloc函数作用差不多,但是参数不同

使用格式:void *calloc( num, size_t  );

num 表示要开辟的个数

size_t表示开辟一个占据的字节数

例如:

int* p = (int*)calloc(10,4

表示开辟10个,每个占据4个字节。

同时作用有些差异

malloc开辟的空间里面是随机值

calloc开辟的空间并且初始化了,初始化为0

4.realloc函数扩容

使用格式:void *realloc( void *memblock, size_t);

void *memblock 第一次开辟空间的地址,要是没有第一次开辟,可以写成NULL 相当于第一次开辟了

size_t开辟空间的总大小 == 第一次的 + 追加的

三种内存的扩容方式:

1.后面的区域比较充裕,直接在原内存后面续上

2.前面有空余:将内存中的内容赋值到前面,后面空闲出来的内存相当于对其扩充内存

3.堆内存不足,扩展空间失败,realloc函数返回NULL。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/592229
推荐阅读
相关标签
  

闽ICP备14008679号