为什么以及何时 malloc() 在 C 中不可用?
Why and when malloc() will not be available in C?
我得到了一块带有嵌入式内部操作系统的基于 8051 的主板。我正在使用 SDCC 创建 OS 以上的应用程序。而且 malloc 不可用,所以我必须静态分配内存。这是为什么? malloc 不应该在编译器中的动态库中吗?
通过项目中包含的 C 库,您可以利用 malloc、printf 等函数。了解 8051 是一种低内存占用设备,只有几 KB。因此,包含 C 库会增加输出 .hex 文件的大小,您将 运行 内存不足。
TL;DR:
Why and when malloc() will not be available in C?
唯一可以笼统地说的是 malloc()
将由每个符合标准的托管 C 实现提供,但还有其他类型,包括另一种符合标准的类型。
Isn't malloc supposed to be on a dynamic library within the compiler?
不完全是。 malloc()
是 C 标准库的一部分,因此它由每个符合标准的托管 C 实现提供。 C 实现包括用于将 C 源代码转换为可执行程序的系统以及用于 运行 生成程序的机制和环境。前者通常围绕编译器展开。后者包括与实现提供的一样多的 C 标准库,如果可用,这部分是 malloc
所在的位置。因此,不,malloc
在技术上不是 编译器 的一部分。
我确定这不是您要调用的区别,但它确实与答案有关。请注意,我说过 malloc
是由 hosted 实现提供的。这些是您通常 运行 在通用操作系统上使用的类型。他们创建通过主机 OS 以标准方式启动的程序,并且他们提供 C 标准库的所有功能以及 OS。但也有 独立的 实现。关键区别之一是独立实现无需提供大多数标准库,包括 malloc()
.
您通常会发现独立的实现用于嵌入式系统,例如您的嵌入式系统。除了 运行 直接在裸机上,它们还用于 OS 内核、引导加载程序和其他此类程序。您的程序 运行 在 OS 之上使您的环境有点像嵌入式系统中的凯迪拉克,但不能确保 C 实现是托管的。由于它不提供 malloc
,因此它不能是 符合要求的 托管实现,但它可以是符合要求的独立实现。它应该记录它声称是哪个(如果有的话)。如果它是独立的,但提供了其他标准库函数,那么你可以认为这是一种奢侈。
(安全)关键系统的某些准则不允许动态内存分配。
例如MISRA C:2004年指南有如下规则:
20.4 - Dynamic heap memory allocation shall not be used.
遵循规则的一种方法是:不要为系统带来或实现malloc()
和其他动态内存分配功能。
这类系统通常是嵌入式系统,在编译期间或之前,内存需求很好 known/limited。因此可以轻松避免动态内存分配。
我得到了一块带有嵌入式内部操作系统的基于 8051 的主板。我正在使用 SDCC 创建 OS 以上的应用程序。而且 malloc 不可用,所以我必须静态分配内存。这是为什么? malloc 不应该在编译器中的动态库中吗?
通过项目中包含的 C 库,您可以利用 malloc、printf 等函数。了解 8051 是一种低内存占用设备,只有几 KB。因此,包含 C 库会增加输出 .hex 文件的大小,您将 运行 内存不足。
TL;DR:
Why and when malloc() will not be available in C?
唯一可以笼统地说的是 malloc()
将由每个符合标准的托管 C 实现提供,但还有其他类型,包括另一种符合标准的类型。
Isn't malloc supposed to be on a dynamic library within the compiler?
不完全是。 malloc()
是 C 标准库的一部分,因此它由每个符合标准的托管 C 实现提供。 C 实现包括用于将 C 源代码转换为可执行程序的系统以及用于 运行 生成程序的机制和环境。前者通常围绕编译器展开。后者包括与实现提供的一样多的 C 标准库,如果可用,这部分是 malloc
所在的位置。因此,不,malloc
在技术上不是 编译器 的一部分。
我确定这不是您要调用的区别,但它确实与答案有关。请注意,我说过 malloc
是由 hosted 实现提供的。这些是您通常 运行 在通用操作系统上使用的类型。他们创建通过主机 OS 以标准方式启动的程序,并且他们提供 C 标准库的所有功能以及 OS。但也有 独立的 实现。关键区别之一是独立实现无需提供大多数标准库,包括 malloc()
.
您通常会发现独立的实现用于嵌入式系统,例如您的嵌入式系统。除了 运行 直接在裸机上,它们还用于 OS 内核、引导加载程序和其他此类程序。您的程序 运行 在 OS 之上使您的环境有点像嵌入式系统中的凯迪拉克,但不能确保 C 实现是托管的。由于它不提供 malloc
,因此它不能是 符合要求的 托管实现,但它可以是符合要求的独立实现。它应该记录它声称是哪个(如果有的话)。如果它是独立的,但提供了其他标准库函数,那么你可以认为这是一种奢侈。
(安全)关键系统的某些准则不允许动态内存分配。
例如MISRA C:2004年指南有如下规则:
20.4 - Dynamic heap memory allocation shall not be used.
遵循规则的一种方法是:不要为系统带来或实现malloc()
和其他动态内存分配功能。
这类系统通常是嵌入式系统,在编译期间或之前,内存需求很好 known/limited。因此可以轻松避免动态内存分配。