0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

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

3天内不再提示

C语言中的动态内存管理

电子工程师 来源:未知 作者:李倩 2018-11-12 14:46 次阅读

本章将讲解 C 中的动态内存管理。C语言为内存的分配和管理提供了几个函数。这些函数可以在头文件中找到。

注意:void * 类型表示未确定类型的指针。C、C++ 规定 void * 类型可以通过类型转换强制转换为任何其它类型的指针。

动态分配内存

编程时,如果您预先知道数组的大小,那么定义数组时就比较容易。例如,一个存储人名的数组,它最多容纳 100 个字符,所以您可以定义数组,如下所示:

char name[100];

但是,如果您预先不知道需要存储的文本长度,例如您向存储有关一个主题的详细描述。在这里,我们需要定义一个指针,该指针指向未定义所需内存大小的字符,后续再根据需求来分配内存,如下所示:

#include

#include

#includeintmain()

{ charname[100];

char *description; strcpy(name, "Zara Ali"); /* 动态分配内存 */ description = (char *)malloc(200 * sizeof(char));

if(description == NULL) { fprintf(stderr, "Error - unable to allocate required memory\n");

} else { strcpy(description, "Zara ali a DPS student in class 10th");

} printf("Name = %s\n", name);

printf("Description: %s\n", description);

}

当上面的代码被编译和执行时,它会产生下列结果:

Name=ZaraAliDescription:Zara ali a DPS student inclass10th

上面的程序也可以使用calloc()来编写,只需要把 malloc 替换为 calloc 即可,如下所示:

calloc(200,sizeof(char));

当动态分配内存时,您有完全控制权,可以传递任何大小的值。而那些预先定义了大小的数组,一旦定义则无法改变大小。

重新调整内存的大小和释放内存

当程序退出时,操作系统会自动释放所有分配给程序的内存,但是,建议您在不需要内存时,都应该调用函数free()来释放内存。

或者,您可以通过调用函数realloc()来增加或减少已分配的内存块的大小。让我们使用 realloc() 和 free() 函数,再次查看上面的实例:

#include

#include

#includeintmain()

{ charname[100];

char *description; strcpy(name, "Zara Ali"); /* 动态分配内存 */ description = (char *)malloc(30 * sizeof(char));

if(description == NULL) { fprintf(stderr, "Error - unable to allocate required memory\n");

} else { strcpy(description, "Zara ali a DPS student.");

} /* 假设您想要存储更大的描述信息 */ description = realloc(description, 100 * sizeof(char));

if(description == NULL) { fprintf(stderr, "Error - unable to allocate required memory\n");

} else { strcat(description, "She is in class 10th");

} printf("Name = %s\n", name);

printf("Description: %s\n", description); /* 使用 free() 函数释放内存 */ free(description);

}

当上面的代码被编译和执行时,它会产生下列结果:

Name=ZaraAliDescription:Zara ali a DPS student.Sheisinclass10th

您可以尝试一下不重新分配额外的内存,strcat() 函数会生成一个错误,因为存储 description 时可用的内存不足。

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

    关注

    180

    文章

    7597

    浏览量

    136120
  • 函数
    +关注

    关注

    3

    文章

    4303

    浏览量

    62411
  • 内存管理
    +关注

    关注

    0

    文章

    168

    浏览量

    14122

原文标题:C语言中的内存管理

文章出处:【微信号:c-stm32,微信公众号:STM32嵌入式开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    动态内存管理模块的设计原理与实现

    Fense 通过设立一个双向链表(struct Head *stHead)来保存所有被分配的动态内存块的信息。链表中的每个节点对应一个动态内存块,节点中包括此内存大小、分配发生时所在的源文件名和行号
    的头像 发表于 06-30 08:05 2327次阅读
    <b class='flag-5'>动态内存</b><b class='flag-5'>管理</b>模块的设计原理与实现

    C语言知识总结:动态内存分配

    动态内存分配就 是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。动态内存分配不像数组等静态内存分配方法那样需要预先分配存储
    发表于 10-24 15:52 836次阅读

    使用C语言实现简单动态内存分配

    首先要明白为何需要动态内存分配,熟悉C语言的读者应该对这个比较熟悉,需要一段内存时会使用malloc函数来申请所需要大小的内存,函数返回一段
    发表于 07-28 16:26 612次阅读
    使用<b class='flag-5'>C</b><b class='flag-5'>语言</b>实现简单<b class='flag-5'>动态内存</b>分配

    C语言中动态内存管理知识

    概述:C语言的优势是可以直接访问内存地址,也就是指针操作,但其缺陷也是因为直接内存访问。如何通过防御性编程提前发现问题,尽可能减少内存异常产
    发表于 09-22 09:54 470次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言中</b>的<b class='flag-5'>动态内存</b><b class='flag-5'>管理</b>知识

    C语言程序设计中动态内存分配如何实现

    C语言程序设计中,动态内存分配如何实现,需要注意哪些问题?
    发表于 09-28 16:53 1274次阅读

    第28章 FreeRTOS动态内存管理

    转: 本章节为大家讲解FreeRTOS动态内存管理动态内存管理是FreeRTOS非常重要的一项功能,前面章节讲解的任务创建、信号量、消息队列、事件标志组、互斥信号量、软件定时器组等需
    发表于 09-11 07:15

    动态内存管理的原理详解

    C/C++语言与其他语言不同,它需要开发者自己管理内存资源。对于
    发表于 11-02 09:25

    【原创】C语言中动态内存-----栈内存

    作者:蔡琰老师(张飞实战电子高级工程师)C语言程序的动态内存分为栈内存区域和堆内存区域两种。栈内存
    发表于 07-07 14:18

    请问使用动态内存分配安全吗?

    想在C语言程序员之间开始一个激烈的,或者说有争议的讨论很简单,只需要问:“使用动态内存分配安全吗?”使用动态内存分配安全吗?在C
    发表于 12-15 06:10

    使用动态内存分配安全吗

    [导读]想在C语言程序员之间开始一个激烈的,或者说有争议的讨论很简单,只需要问:“使用动态内存分配安全吗?”想在C语言程序员之间开始一个激烈
    发表于 12-15 07:44

    一个动态内存管理模块的实现

    介绍一个动态内存管理模块,可以有效地检测C程序中内存泄漏和写内存越界等错误,适用于具有标准C
    发表于 04-16 14:18 14次下载

    一个动态内存管理模块的实现

    介绍一个动态内存管理模块,可以有效地检测C程序中内存泄漏和写内存越界等错误,适用于具有标准C
    发表于 05-14 14:39 10次下载

    动态内存错误的静态检测

    内存泄漏、空指针引用等动态内存错误在/,/LL等支持动态内存操作的程序中普遍存在在程序中,动态内存管理错误是导致
    发表于 06-10 16:29 52次下载
    <b class='flag-5'>动态内存</b>错误的静态检测

    嵌入式C语言中动态内存管理动态内存分配

    动态内存管理同时还具有一个优点:当程序在具有更多内存的系统上需要处理更多数据时,不需要重写程序。
    发表于 08-15 17:16 2259次阅读

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

    本章将讲解 C 中的动态内存管理C 语言内存的分配和管理
    的头像 发表于 02-23 14:03 365次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言中</b>的<b class='flag-5'>动态内存</b><b class='flag-5'>管理</b>讲解