TL; DR:
为什么以及何时在C中无法使用malloc()?
唯一可以说的是,malloc()每个符合要求的托管C实现都会提供,但还有其他类型,包括另一种符合要求的类型.
malloc不应该在编译器中的动态库上吗?
不完全是. malloc()是C标准库的一部分,因此它由每个符合标准的托管C实现提供.AC实现包括用于将C源代码转换为可执行程序的系统以及用于运行所得到的程序的机制和环境.前者通常围绕编译器.后者包括与实现提供的C标准库一样多的内容,malloc如果可用,则此部分位于其中.因此,不,malloc技术上不是编译器的一部分.
我敢肯定,这不是你想要引用的区别,但它确实对答案有影响.请注意,我说这malloc是由托管实现提供的.这些是您通常在通用操作系统上遇到的类型.它们创建通过主机操作系统以标准方式启动的程序,它们与操作系统一起提供C标准库的所有功能.但也有独立的实现.其中一个关键的区别是独立实现可以免于提供大多数标准库,包括malloc().
您通常会在嵌入式系统中找到独立的实现,例如您的嵌入式系统.它们还用于OS内核,引导加载程序和其他此类程序,而不是直接在裸机上运行.您的程序在操作系统之上运行会使您的环境成为嵌入式系统中的凯迪拉克,但不能确保C实现是托管系统.由于它没有提供malloc,它不能是一致的托管实现,但它可以是一个符合标准的独立实现.它应该记录它声称是哪一个,如果有的话.如果它是独立的,但提供其他标准库函数,那么你可以认为这是一种奢侈.