1 周立功:动态分布内存——malloc()函数与calloc()函数-德赢Vwin官网 网
0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

周立功:动态分布内存——malloc()函数与calloc()函数

AGk5_ZLG_zhiyua 来源:互联网 作者:佚名 2017-08-22 17:01 次阅读

周立功教授数年之心血之作《程序设计与数据结构》,电子版已无偿性分享到电子工程师与高校群体,在公众号回复【程序设计】即可在线阅读。书本内容公开后,在电子行业掀起一片学习热潮。经周立功教授授权,本公众号特对本书内容进行连载,愿共勉之。

第一章为程序设计基础,本文为1.9.1 malloc()函数和1.9.2 calloc()函数。

》》》》 1.9 动态分配内存

首先回顾一下内存分配,所有程序都必须预留足够的内存存储程序使用的数据,这些内存中有些是自动分配的。比如,声明“int iNum;”为一个int类型的值预留了足够的内存,或显式指定分配一定数量的内存,“int pData[20];”声明预留了20个内存位置,每个位置存储的是int类型的值。声明还为内存提供了标识符,因此可以使用iNum或pData识别数据。静态数据在程序载入内存时分配的,自动数据是在程序执行时分配的,并在程序离开时销毁。但C能做的远不止这些,可以在程序运行时请求所需要的内存大小。

程序在运行时分配的内存空间称之为“堆”的存储池,虽然计算机在硬件上不直接支持堆,但C函数库(stdlib.h)分别提供了用于动态内存分配和释放的函数malloc()和free(),即在运行时根据需要创建一个存储单元,在不需要时释放。

》》》 1.9.1 malloc()函数

malloc()函数原型如下:

void *malloc(unsigned int size);

其中,void *表示该函数是指针函数,size为所需内存的字节数,可以用sizeof运算符计算每个元素所需要的空间数量和所有元素需要内存的字节数。如果分配成功,虽然malloc()不会为分配的内存赋名,但它确实返回了动态分配内存块的首字节地址。因此可以将该地址赋给一个指针变量,并使用指针变量访问这块内存。如果分配不成功或内存不足,则返回空指针NULL。因此在使用它返回的指针之前,一定要先检查返回值,否则可能会导致程序非正常终止。比如:

int *pi = malloc(sizeof(int));

if(pi != NULL){

// 指针没有问题

}else{

// 无效的指针

}

malloc()函数可用于返回指向数组的指针、指向结构的指针等,所以通常该函数的返回值会被强制转换为匹配的类型,但从C99版本开始,void *类型的指针不需要强制转换地赋给所有的指针类型变量。

当编写程序时,常常很难为数组估计合适的大小,较为方便的做法是等到程序运行时,再来确定数组的实际大小。其方法是用malloc()在程序执行期间为数组分配空间,然后通过指向数组第一个元素的指针访问数组。假设正在编写的程序需要n个整数构成的数组,这里的n可以在程序执行期间计算出来。首先需要声明指针变量:

int * pi, n;

一旦n的值已知,就让程序调用malloc()函数为数组分配存储空间:

pi = malloc(n * sizeof(int));

if(pi == NULL) return -1;

当pi指向分配动态分配的内存块时,就可以忽略pi是指针的事实,将它作为数组名使用,这是C语言数组和指针形成紧密关系的所带来的便利。由于数组名是该数组首元素的地址,如果让pi指向这个块的首元素,便可以象使用数组名一样使用它。即可以使用pi[0]访问该块的首元素,pi[1]访问第2个元素,以此类推。比如,使用下列循环对pi指向的数组进行初始化:

for(i = 0; i 《 n; i++) pi[i] = 0;

动态内存分配可以提供更多的灵活性,比如:

char *pcStr;

char *pcStr = malloc(strlen(“OK!”) + 1);

strcpy(pcStr, “OK!”);

在这里,使用strlen()计算字符串的长度,一定要记得加上结束符NUL。为何不用sizeof呢?因为szieof会返回数组和指针的长度,而不是字符串的长度。

》》》 1.9.2 calloc()函数

虽然可以用malloc()函数为数组分配内存,但C语言提供了一种更好用的calloc()函数,其函数原型如下:

void *calloc(size_t nmenb, size_t size);

calloc()函数为nmemb个元素的数组分配内存空间,其中,每个元素的长度都是size个字节。如果要求的空间无效,那么此函数返回指针。在分配了内存之后,calloc()函数会通过将所有位设置为0的方式进行初始化。比如,调用calloc()函数为n个整数的数组分配存储空间,且保证所有整数初始化为0。比如:

pi = calloc(n, sizeof(int));

因为calloc()函数会清楚分配的内存,而malloc()函数不会,所以可以调用以“1”作为第一个实参的calloc()函数,为任何类型的数据项分配空间。比如:

struct point{ int x, y;} *pi;

pi = calloc(1, sizeof(struct point));

在执行此语句后,pi将指向一个结构体,且此结构体的成员x和y都会被设为0。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网 网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 周立功
    +关注

    关注

    38

    文章

    130

    浏览量

    37614
  • 大数据
    +关注

    关注

    64

    文章

    8882

    浏览量

    137391
  • malloc
    +关注

    关注

    0

    文章

    52

    浏览量

    73

原文标题:周立功:动态分布内存——malloc()函数与calloc()函数

文章出处:【微信号:ZLG_zhiyuan,微信公众号:ZLG致远电子】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    RNN的损失函数与优化算法解析

    函数有以下几种: 交叉熵损失函数 :交叉熵(Cross Entropy)是一种评估两个概率分布之间差异的度量方法,即通过比较模型预测的概率分布和真实概率
    的头像 发表于 11-15 10:16 354次阅读

    SUMIF函数与SUMIFS函数的区别

    SUMIF函数和SUMIFS函数都是Excel中用于条件求和的函数,它们可以帮助用户根据特定的条件对数据进行求和。尽管它们的基本功能相似,但在使用场景和功能上存在一些差异。以下是对这两个函数
    的头像 发表于 10-30 09:51 1011次阅读

    内存管理的硬件结构

    常见的内存分配函数malloc,mmap等,但大家有没有想过,这些函数在内核中是怎么实现的?换句话说,Linux内核的内存管理是怎么实现的
    的头像 发表于 09-04 14:28 290次阅读
    <b class='flag-5'>内存</b>管理的硬件结构

    面试常考+1:函数指针与指针函数、数组指针与指针数组

    在嵌入式开发领域,函数指针、指针函数、数组指针和指针数组是一些非常重要但又容易混淆的概念。理解它们的特性和应用场景,对于提升嵌入式程序的效率和质量至关重要。一、指针函数函数指针指针
    的头像 发表于 08-10 08:11 824次阅读
    面试常考+1:<b class='flag-5'>函数</b>指针与指针<b class='flag-5'>函数</b>、数组指针与指针数组

    使用system_show_malloc()检查内存泄漏遇到异常怎么解决?

    我想使用system_show_malloc()检查内存泄漏,但是当我调用该函数时,我得到了致命的异常: 致命异常 28 (LoadProhibitedCause): epc1
    发表于 07-10 06:32

    malloccalloc功能来实现DAQ,在调试模式下调用callocmalloc函数时似乎卡住了,为什么?

    我正在使用 malloccalloc 功能来实现 DAQ。 我使用的是 TLE9893 系列芯片。 代码编译良好,但在调试模式下调用 callocmalloc
    发表于 05-27 08:29

    你知道吗? 51单片机也有动态内存分配

    一、简述其实在51单片机中也可以使用动态内存动态内存其实就是划出一块内存区域,将这块内存进行管理,称为内存管理。51单片机可以使用c语言自
    的头像 发表于 04-26 08:10 1503次阅读
    你知道吗? 51单片机也有<b class='flag-5'>动态内存</b>分配

    如果没有用到malloc和free函数,是否会有ram动态使用率这一概念?

    如果没有用到malloc和free函数,是否会有ram动态使用率这一概念?
    发表于 04-12 06:29

    C语言内存泄漏问题原理

    内存泄漏问题只有在使用堆内存的时候才会出现,栈内存不存在内存泄漏问题,因为栈内存会自动分配和释放。C语言代码中堆
    发表于 03-19 11:38 520次阅读
    C语言<b class='flag-5'>内存</b>泄漏问题原理

    回调函数(callback)是什么?回调函数的实现方法

    回调函数是一种特殊的函数,它作为参数传递给另一个函数,并在被调用函数执行完毕后被调用。回调函数通常用于事件处理、异步编程和处理各种操作系统和
    发表于 03-12 11:46 2900次阅读

    函数指针与回调函数的应用实例

    通常我们说的指针变量是指向一个整型、字符型或数组等变量,而函数指针是指向函数函数指针可以像一般函数一样,用于调用函数、传递参数。
    的头像 发表于 03-07 11:13 399次阅读
    <b class='flag-5'>函数</b>指针与回调<b class='flag-5'>函数</b>的应用实例

    C语言中的动态内存管理讲解

    本章将讲解 C 中的动态内存管理。C 语言为内存的分配和管理提供了几个函数。这些函数可以在 头文件中找到。
    的头像 发表于 02-23 14:03 388次阅读
    C语言中的<b class='flag-5'>动态内存</b>管理讲解

    verilog function函数的用法

    Verilog 是一种硬件描述语言 (HDL),主要用于描述数字电子电路的行为和结构。在 Verilog 中,函数 (Function) 是一种用于执行特定任务并返回一个值的可重用代码块。函数
    的头像 发表于 02-22 15:49 5505次阅读

    内联函数定义 为什么需要内联函数

    inline关键字是C99标准的型关键字,其作用是将函数展开,把函数的代码复制到每一个调用处。
    的头像 发表于 02-19 12:20 540次阅读

    函数指针和指针函数是不是一个东西?

    函数指针的本质是指针,就跟整型指针、字符指针一样,函数指针指向的是一个函数
    的头像 发表于 01-03 16:35 524次阅读
    <b class='flag-5'>函数</b>指针和指针<b class='flag-5'>函数</b>是不是一个东西?