malloc函数用法

这篇具有很好参考价值的文章主要介绍了malloc函数用法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


m a l l o c malloc malloc函数是一种分配长度为num_bytes字节的内存块的函数,可以向系统申请分配指定size个字节的内存空间。malloc的全称是memory allocation(动态内存分配),当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存。返回类型是 v o i d ∗ void* void 类型。 v o i d ∗ void* void 表示未确定类型的指针。C,C++规定, v o i d ∗ void* void 类型可以通过类型转换强制转换为任何其它类型的指针。

1、函数原型及说明

v o i d ∗ m a l l o c ( l o n g N u m B y t e s ) void *malloc(long NumBytes) voidmalloc(longNumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针。如果分配失败,则返回一个空指针(NULL)。分配失败的原因,应该有多种比如说空间不足就是一种。

v o i d f r e e ( v o i d ∗ F i r s t B y t e ) void free(void *FirstByte) voidfree(voidFirstByte): 该函数是将之前用malloc分配的空间还给程序或者是操作系统,也就是释放了这块内存,让它重新得到自由。

2、函数的用法

使用前要申明: # i n c l u d e < s t d l i b . h > \#include <stdlib.h> #include<stdlib.h>或者 # i n c l u d e < m a l l o c . h > \#include <malloc.h> #include<malloc.h>

如果在source code中没有直接或者间接include过stdlib.h,那么gcc就会报出error: ‘ m a l l o c ’ w a s n o t d e c l a r e d i n t h i s s c o p e ‘malloc’ was not declared in this scope mallocwasnotdeclaredinthisscope

其实这两个函数用起来倒不是很难,也就是malloc()之后觉得用够了就甩了它把它给free()了,举个简单例子:

        // Code...

        char *Ptr = NULL;

        Ptr = (char *)malloc(100 * sizeof(char));

        if (NULL == Ptr)
        {
             exit (1);
        }

        gets(Ptr);

        // code...

        free(Ptr);

        Ptr = NULL;

        // code...

就是这样!
当然,具体情况要具体分析以及具体解决。比如说,你定义了一个指针,在一个函数里申请了一块内存然后通过函数返回传递给这个指针,那么也许释放这块内存这项工作就应该留给其他函数了。

3、malloc函数与new函数区别

new返回指定类型的指针,并且可以自动计算所需要的大小。

int *p;
 
p = new int;   //返回类型为int *类型,分配的大小为sizeof(int)
 
p = new int[100];    //返回类型为int *类型,分配的大小为sizeof(int) * 100

而malloc则必须由我们计算字节数,并且在返回的时候强转成实际指定类型的指针。

int *p;
 
p = (int *)malloc(sizeof(int));
 
/*.......*/
free(p);

malloc的返回是 v o i d ∗ void * void,如果我们写成了: p = m a l l o c ( s i z e o f ( i n t ) ) p = malloc(sizeof(int)) p=malloc(sizeof(int))间接的说明了(将 v o i d ∗ void * void转化给了 i n t ∗ int * int,这不合理);
malloc的实参是sizeof(int),用于指明一个整形数据需要的大小,如果我们写成: p = ( i n t ∗ ) m a l l o c ( 1 ) p = (int *)malloc(1) p=intmalloc(1),那么可以看出:只是申请了一个字节的空间,如果向里面存放了一个整数的话,将会占用额外的3个字节,可能会改变原有内存空间中的数据;
malloc只管分配内存,并不能对其进行初始化,所以得到的一片新内存中,其值将是随机的。一般意义上:我们习惯性的将其初始化为NULL。当然,也可以用memset函数的。
简单的说:malloc 函数其实就是在内存中:找一片指定大小的空间,然后将这个空间的首地址给一个指针变量,这里的指针变量可以是一个单独的指针,也可以是一个数组的首地址, 这要看malloc函数中参数size的具体内容。我们这里malloc分配的内存空间在逻辑上是连续的,而在物理上可以不连续。我们作为程序员,关注的 是逻辑上的连续,其它的,操作系统会帮着我们处理的。

4、其他说明

关于该函数的原型,在以前malloc返回的是char型指针,新的ANSIC标准规定,该函数返回为void型指针,因此必要时要进行类型转换。

如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。函数返回的指针一定要适当对齐,使其可以用于任何数据对象。

5、malloc工作机制

malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块。然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存传给用户,并将剩下的那块(如果有的话)返回到连接表上。

调用free函数时,它将用户释放的内存块连接到空闲链上。到最后,空闲链会被切成很多的小内存片段,如果这时用户申请一个大的内存片段,那么空闲链上可能没有可以满足用户要求的片段了。于是,malloc函数请求延时,并开始在空闲链上翻箱倒柜地检查各内存片段,对它们进行整理,将相邻的小空闲块合并成较大的内存块。如果无法获得符合要求的内存块,malloc函数会返回NULL指针,因此在调用malloc动态申请内存块时,一定要进行返回值的判断。Linux Libc6采用的机制是在free的时候试图整合相邻的碎片,使其合并成为一个较大的free空间。

参考资料
[ 1 ] h t t p s : / / b l o g . c s d n . n e t / c h f _ 1 / a r t i c l e / d e t a i l s / 78688557. h t m l [1]https://blog.csdn.net/chf\_1/article/details/78688557.html [1]https://blog.csdn.net/chf_1/article/details/78688557.html
[ 2 ] h t t p s : / / w w w . c n b l o g s . c o m / C o m m e n c e / p / 5785912. h t m l [2]https://www.cnblogs.com/Commence/p/5785912.html [2]https://www.cnblogs.com/Commence/p/5785912.html
[ 3 ] h t t p s : / / w w w . c n b l o g s . c o m / s h i w e i h a p p y / p / 4246372. h t m l [3]https://www.cnblogs.com/shiweihappy/p/4246372.html [3]https://www.cnblogs.com/shiweihappy/p/4246372.html文章来源地址https://www.toymoban.com/news/detail-756300.html

到了这里,关于malloc函数用法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言使用malloc函数模拟开辟二维数组(带分析)

    🌟 个人主页 :古德猫宁- 当我们使用malloc函数来模拟创建一个二维数组时,我们需要理解二维数组在内存中是如何存储的。在C语言中,二维数组实际上是一维数组的数组。也就是说,一个二维数组可以被看作是一个包含多个一维数组的数组 考虑一个row行、cols列的二维整数

    2024年02月02日
    浏览(42)
  • C语言中灵活多变的动态内存,malloc函数 && free函数&& calloc函数 && realloc函数

    铁子们好啊!今天阿辉给大家讲一下C语言里面特别重要的一块知识——动态内存管理,为什么说它重要呢?相信大家在使用数组时都遇到过数字开辟空间太大或者太小的情况,这是很尴尬的因为数组空间一旦确定就难以扩大或者缩小。而今天的动态内存管理将帮我们很好的解

    2024年02月03日
    浏览(39)
  • C语言——动态内存函数(malloc、calloc、realloc、free)

    在C语言中,动态内存函数是块重要的知识点。以往,我们开辟空间都是固定得,数组编译结束后就不能继续给它开辟空间了,开辟的空间满了,就不能在开辟空间了(就是不能在添加数据了)。学习本文章,我们就可以解决这个问题,向内存申请空间,满啦可以继续申请空间

    2024年02月13日
    浏览(43)
  • C语言的exit()函数用法

    exit() 函数是 C 语言标准库 stdlib.h 中提供的函数,用于终止程序的执行并返回到操作系统。它的原型如下: exit() 函数接受一个整数参数 status ,表示程序的退出状态码。这个状态码可以用来向调用程序传递一些信息,例如程序是否正常结束、出现了什么错误等。 使用 exit() 函

    2024年02月04日
    浏览(46)
  • 动态内存函数malloc,calloc,realloc详解

    🍍个人主页🍍:🔜勇敢的小牛儿🚩 🔱推荐专栏🔱:C语言知识点 ⚠️座右铭⚠️: 敢于尝试才有机会 🐒今日鸡汤🐒: 出色一点 从能力到容貌 目录 思维导图: 一,malloc : 1.1:malloc函数简介: 1.2:malloc函数的使用:  代码: 二,calloc函数 2.1calloc函数简介: 2.2calloc函数

    2024年02月04日
    浏览(44)
  • C语言的库函数:strlen的用法

    首先,strlen使可以计算字符串的长度,且只能用于字符串,计算的是\\0之前的字符个数。 因为strlen是库函数,所以其头文件是string.h 输出结果如下:  为何arr1输出值为33? 因为arr数组中存放的是a b c d e f \\0 ,而arr1中放的是a b c..\\0。 strlen只有在遇到\\0时才会停下来,而arr1中不知

    2024年02月12日
    浏览(46)
  • C语言,malloc使用规范

            malloc 是 C 语言中用于分配内存的函数。它的名称是“memory allocation”的缩写。malloc 是在 stdlib.h 头文件中定义的。         malloc 的基本语法是: void* malloc(size_t size);         其中 size_t是要分配的字节数。如果分配成功,malloc返回一个指向分配内存的第一

    2024年02月12日
    浏览(34)
  • strstr函数详解 看这一篇就够了-C语言(函数讲解、函数实现、使用用法举例、作用、自己实现函数 )

     strstr()函数用于:查找子字符串 目录 函数介绍 用法示例 函数讲解 实现函数  事例展示 函数声明:char *strstr(const char *str1, const char *str2) 头  文  件:#include string.h 返  回  值: 返回值为char * 类型( 返回指向  str1  中第一次出现的  str2  的指针);如果  str2  不是 

    2024年02月13日
    浏览(49)
  • memcmp函数详解 看这一篇就够了-C语言(函数讲解、函数实现、使用用法举例、作用、自己实现函数 )

    memcmp()函数用于:比较两个内存块 函数声明:int memcmp ( const void * ptr1, const void * ptr2, size_t num ); 参数: ptr1:指向内存块的指针。 ptr2:指向内存块的指针。 数字:要比较的字节数。 返回值: 0: 在两个内存块中不匹配的第一个字节在  ptr1  中的值低于 在 ptr2  中的值(如果计

    2023年04月09日
    浏览(64)
  • 【嵌入式软件C编程】主函数free子函数malloc地址的两种方式以及注意事项

    本文档主要记录嵌入式C语言在子函数中应用malloc函数的方式,在实际项目中内存管理特别重要 一般在主函数中(main)使用malloc函数,然后在通过free函数进行释放内存,但有时候如果必须在子函数长调用malloc函数该怎样进行内存释放呢? 📋 个人简介 💖 作者简介:大家好,

    2024年02月09日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包