C语言

malloc动态开辟内存

2020-03-13  本文已影响0人  风情云

动态开辟内存

平时在程序中的普通变量是开辟在栈区,如果程序过大,所有的普通变量都开辟在栈区,栈区内存会不足,内存溢出,程序出错。所以要将一些比较大的开销放在堆区。堆区由我们手动开辟,手动释放。不同于栈区,定义变量就自动开辟,变量生命周期结束会自动释放。下面看看如何在堆区手动开辟内存

malloc

函数介绍
<stdlib.h> //头文件
void *malloc( size_t size );
形参 size 开辟的内存块大小
返回类型 void * 万能指针类型

    //动态开辟内存
    //在堆区开辟4个字节内存
    int *ptr = NULL;
    ptr = (int*)malloc(sizeof(int));
    //也可以写成
    //ptr = malloc(sizeof(int))
    //最好强制类型转换一下
动态开辟内存

操作堆区的内存与在栈区的操作一样,ptr已经拿到地址,就可以指针法操作内存。

    *ptr = 10;

手动开辟内存后,需要手动释放内存
void free( void *ptr );
形参为区地址,无返回值。

    //手动释放内存
    free(ptr);

动态开辟内存(malloc),告诉系统该内存块有人使用,不允许再次动态开辟内存,来使用这块内存块。手动释放(free)后,该指针与此内存块没有联系,允许动态开辟内存使用该内存块。禁止手动释放同一块内存两次,禁止手动释放内存后,再次操作该内存。这样会导致运行出错,这是因为操作非法内存。避免这种情况的出现,再手动释放内存后,讲该指针置为NULL;

    ptr = NULL;

realloc

<stdlib.h>
void *realloc( void *ptr, size_t size );
功能: 函数将ptr 对象的储存空间改变为给定的大小size。 参数size可以是任意大小,大于或小于原尺寸都可以。 返回值是指向新空间的指针,如果错误发生返回NULL。
这个函数的使用需要先在堆区开辟内存,然后使用该函数动态修改操作的内存块大小。

    int *ptr = NULL;
    ptr = (int*)malloc(4);
    realloc(ptr,8);
    printf("ptr: %u\n",ptr);
    realloc(ptr,4);
    printf("ptr: %u\n",ptr);

结果展示

ptr: 10297496
ptr: 10297496
realloc

动态改变内存大小,指针指向的内存首地址不变。这个就可以用于动态数组。

注意事项

动态开辟内存,不需要后及时手动释放,并把指针指向空,养成良好的编程习惯。realloc会有一些坑,尽量使用malloc。

文章结束


微信号
上一篇 下一篇

猜你喜欢

热点阅读