C 内存的动态分配怎么用?有啥建议吗?内存分配中栈与堆到底有啥不同啊?

Posted 我要出家当道士

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C 内存的动态分配怎么用?有啥建议吗?内存分配中栈与堆到底有啥不同啊?相关的知识,希望对你有一定的参考价值。

目录

一、内存存储区域中堆与栈的区别

二、动态分配函数解析

   1、malloc 

   2、realloc

   3、free

   4、使用建议


一、内存存储区域中堆与栈的区别

动态分配的是堆里面的内存。相比于栈存放的局部变量有以下几点不同:

1、动态分配中内存的管理需要程序员进行控制,基本流程是先申请,使用完后进行释放;不释放的话会造成内存泄漏。

2、动态分配可申请很大的空间(堆,向高地址扩展,所以空间往很大了想),虽然受制于当前内存使用状况,机器参数等,但相比于栈(栈顶固定,向低地址扩展,所以空间固定,1M~2M)还是要大得多。

3、动态分配的效率较低。申请内存时,会在一个空闲内存链表中寻找满足申请空间大小的内存块,找到之后分割满足用户需求的内存块返回给用户。哈哈,有点类似于你在一个房间里找一块空间放物品,虽然每次很大可能找到差不多的空间使用,但由于你每次堆放的物品大小都不一致,所以不能很好的全局规划,最后造成房间里很乱,很多犄角旮旯的地方,存在很多碎片空间。每次放新的物品都要在房间里转一圈才能找到合适的空间,甚至可能出现失败的情况,因为房间里已经找不到整块的连续的空间供你使用。

二、动态分配函数解析

   1、malloc 

        在堆区分配一块指定大小的内存空间,用来存放数据。这块内存空间在函数执行完成后不会被初始化,它们的值是未知的。

        如果设置的参数为 0,则返回空指针或者一个特殊的指针(会被 free() 忽略)。

void *malloc(int num);

        使用该函数后需要根据具体的接收指针的类型强制转换一下。  并判断是否为空,因为可能出现分配失败的情况。

// 分配一个长度为 10 的数组,一共 40 byte
int *array = (int *)malloc(sizeof(int) * 10);
if (array == NULL)

    printf("malloc failed\\n");
    return -1;

   2、realloc

        若 malloc 分配的内存不够用,可以使用该函数进行扩容。原有的内容不变,新申请的空间未初始化。

        如果 address 是 NULL,则该函数等同于 malloc 函数;

        如果 newsize 为 0,则该函数等同于 free 函数。

void *realloc(void *address, int newsize);

        你可能会问,为啥不用 malloc 重新申请呢?  嘿嘿,malloc 重新分配的话,其空间不会被初始化的,需要你把原来的值先备份,并free掉该空间后,重新赋值到新的变量上,效率很低的。     

 char *strs = (char *)malloc(sizeof(char) * 2);
 // 扩容 1 个
 strs = (char *)realloc(strs, sizeof(char) * 3);

   3、free

        申请的空间需要释放。虽然有时候程序跑完就结束,系统也会自动回收内存,但良好的代码编写习惯还是要养成。同一个动态申请内存的指针只能free一次,否则会报错的呀(free(): double free detected in tcache)。

void free(void *address);

   4、使用建议

(1)为了防止出现野指针,指针必须初始化为 NULL ,使用完后释放资源资源,需重新使其变为 NULL。

(2)指针都应该指向一个合法的内存地址,要注意类似 char *str 等类型的代码,必须分配内存空间后再赋值。

(3)给指针分配内存的时候,一定要充足,防止内存越界。类似于结构体等类型,需要计算其所占内存空间(可查看C结构体的内存对齐知识点)。

(4)指针内存分配结束后,记得初始化,其默认值可能不为0。

(5)使用 malloc 分配内存的时候可能遇到机器内存不足的情况,所以使用前一定要检查 if(NULL != p)

(6)参考以下使用顺序

int *p = (int *)malloc(10 * sizeof(int));
if (NULL != p)

    ...

free(p);
p = NULL;

参考:

C 内存管理 | 菜鸟教程 (runoob.com)

C/C++内存管理详解 - 邱明成 - 博客园 (cnblogs.com)

(66 封私信 / 2 条消息) malloc内存未释放问题? - 知乎 (zhihu.com)

C static关键字解析,看完就懂,不迷糊_我要出家当道士-CSDN博客

LinuxC面试宝典笔记.pdf_C语言面试高级-其它文档类资源-CSDN文库

以上是关于C 内存的动态分配怎么用?有啥建议吗?内存分配中栈与堆到底有啥不同啊?的主要内容,如果未能解决你的问题,请参考以下文章

c和c ++中的动态内存分配和堆有啥区别

怎么查看动态分配内存空间的大小(c语言)。

分配的内存和保留的内存有啥区别?

C语法中的内存分配

C语言之动态内存管理(动态内存分配+经典笔试题+柔性数组)[建议收藏]

C程序定义一指针变量,直接令它赋值为NULL,不对它用malloc申请内存可以么?赋值和申请内存到底有啥区别