为什么以及何时在C中无法使用malloc()?

时间:2018-09-12 12:51:44

标签: c malloc 8051 sdcc

我获得了基于8051的板卡,并带有嵌入式内部操作系统。我正在使用SDCC在操作系统上方创建应用程序。而且malloc不可用,因此我必须静态分配内存。这是为什么? malloc是否不应该位于编译器中的动态库上?

3 个答案:

答案 0 :(得分:6)

TL; DR:

  

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

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


  

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

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

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

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

答案 1 :(得分:1)

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

例如MISRA C:2004准则具有以下规则:

  

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

遵循规则的一种方法是:不要为系统带来或实现malloc()和其他动态内存分配功能。

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

答案 2 :(得分:-1)

使用包含在项目中的C库,您可以利用malloc,printf等功能。了解8051是一种内存不足的打印设备,大约几KB。因此,包含C库会增加输出.hex文件的大小,并且会耗尽内存。