【问题标题】:Why and when malloc() will not be available in C?为什么以及何时 malloc() 在 C 中不可用?
【发布时间】:2019-02-17 02:59:51
【问题描述】:

我得到了一个基于 8051 的板,带有嵌入式内部操作系统。我正在使用 SDCC 在操作系统之上创建应用程序。而且 malloc 不可用,所以我必须静态分配内存。这是为什么? malloc 不应该在编译器中的动态库上吗?

【问题讨论】:

  • 不存在的不能分配...
  • 没有。 malloc 是标准库的一部分,而不是编译器的一部分。所以你的板子必须提供一个实现malloc的库。
  • 在 RAM 很少的系统上,动态内存分配在大多数情况下没有多大意义。
  • @PaulOgilvie board,真的吗?

标签: c malloc 8051 sdcc


【解决方案1】:

TL;DR:

为什么以及何时 malloc() 在 C 中不可用?

一般来说,唯一可以说的是malloc() 将由每个符合要求的托管 C 实现提供,但还有其他类型,包括另一种符合要求的类型。


malloc 不应该在编译器中的动态库上吗?

不完全是。 malloc() 是 C 标准库的一部分,因此它由每个符合要求的托管 C 实现提供。 C 实现包括用于将 C 源代码转换为可执行程序的系统以及用于运行结果程序的机制和环境。前者通常围绕编译器展开。后者包括实现提供的尽可能多的 C 标准库,如果可用,这部分是 malloc 所在的位置。因此,不,malloc 在技术上不是编译器的一部分。

我确定这不是您要调用的区别,但它确实与答案有关。请注意,我说过malloc托管 实现提供。这些是您通常在通用操作系统上遇到的那种。它们创建通过主机操作系统以标准方式启动的程序,并结合操作系统提供 C 标准库的所有功能。但也有独立实现。主要区别之一是独立实现不提供大部分标准库,包括malloc()

您通常会发现在嵌入式系统(例如您的系统)上使用的独立实现。它们还用于操作系统内核、引导加载程序和其他此类程序,而不是直接在裸机上运行。您的程序在操作系统之上运行使您的环境在嵌入式系统中有点像凯迪拉克,但并不能确保 C 实现是托管的。由于它不提供malloc,它不能是一个符合 托管的实现,但它可以是一个符合标准的独立实现。它应该记录它声称是哪个,如果有的话。如果它是独立的,但提供了其他标准库函数,那么您可以认为这是一种奢侈。

【讨论】:

  • @cleveraintwise,不,除非实现声称是符合要求的托管实现,否则不能安全地假设 malloc() 将可用于执行环境中的程序。时期。 no 库函数是 C 标准要求独立实现提供的,甚至 malloc() 也没有,并且该标准对不符合标准的实现完全没有要求。阅读您的实现文档是无可替代的,至少足以检查它是否声称是符合规范的托管文档。
  • 如果有的话我会的。
  • @cleveraintwise,根本没有任何文档,您根本没有任何基础可以或应该编写什么代码。即使“文档”意味着负责 C 实现的人的口口相传,你也必须有一些东西才能做任何工作。
【解决方案2】:

(安全)关键系统的一些准则不允许动态内存分配。

例如MISRA C:2004指南有如下规则:

20.4 - 不应使用动态堆内存分配。

遵循规则的一种方法是:不要将malloc()和其他动态内存分配功能带到系统中。

这类系统通常是嵌入式系统,在编译期间或之前,内存需求是众所周知的/有限的。因此可以轻松避免动态内存分配。

【讨论】:

    【解决方案3】:

    通过项目中包含的 C 库,您可以利用诸如 malloc、printf....等函数 了解 8051 是一种低内存占用的设备,仅几 KB。因此,包含 C 库会增加输出 .hex 文件的大小,并且您将耗尽内存。

    【讨论】:

    • 问题是内存。除非有XDATA空间,。 malloc() 等是 umm ......在 8051 上“最好避免”。
    • 实际上即使有 XDATA RAM,malloc() 等也是 umm... '最好避免'在 8051 上。
    • 其实完全避开8051并不是不合理的做法;)
    猜你喜欢
    • 2020-07-22
    • 2014-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    相关资源
    最近更新 更多