我想在必须跨平台的C程序中使用malloc()
。但是,它在哪里?我知道C89和C99语言标准要求它可以通过<stdlib.h>
获得,但有些平台没有。我注意到,在某些情况下,它可能在<malloc.h>
中,并且读到它可能在<malloc/malloc.h>
中。
我的问题是:哪些平台在哪些位置有malloc()
?具体是我提到的三个地点?
注意:请不要建议我使用跨平台开发框架,这与我的情况无关。
所有符合的托管C实现在<stdlib.h>
中都有malloc
独立实现不需要来提供<stdlib.h>
下面列出了一些有用的直接链接到C89/C90、C99和C11标准的免费PDF文件:
C89/C90(ISO/IEC 9899:1990):https://www.pdf-archive.com/2014/10/02/ansi-iso-9899-1990-1/ansi-iso-9899-1990-1.pdf
C99(ISO/IEC 9899:1999):http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf
C11(ISO/IEC 9899:2011):http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf
C17/18(ISO/IEC 9899:2018)https://web.archive.org/web/20181230041359if_/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf
正如问题所述,标准要求在<stdlib.h>
中声明。我建议你检查一下你的文件。标准是必须在该标头中声明,但可以在其他标头中声明(直接或间接)。
如果您针对的是<stdlib.h>
中没有声明的不一致平台,那么显而易见的答案是#include
和<stdlib.h>
。这样一来,你就可以在合规的平台和你所知道的奇怪的球上表现出色。
你甚至可以再投一个球。假设它只在<string.h>
中声明,那么您可以在项目"stdlibfix.h"
中定义一个头:
#include <string.h>
#include <stdlib.h>
注意:省略了收割台防护,实际上此处不需要。
如果它存在于某些非标准标头(如<memory.h>
)中,请使用条件编译。大多数编译器都定义了一些标识自己的宏,例如SMITH_COMPILER,那么您就需要
#ifdef SMITH_COMPILER
#include <memory.h>
#endif
您甚至可能遇到不允许动态内存分配的平台,例如小型嵌入式平台。如何处理这一问题超出了本文的范围,但通常最好避免它,而不是实现它。在这样的应用程序中,您可以也应该计算您的最大存储需求,并将其实现为变量和固定大小的阵列。
避免仅仅声明其原型:
void *malloc(size_t sz);
在一些平台上,CCD_ 16可以被不同地声明(例如,不同的调用约定)。
鉴于我们已经在谈论一个不符合<stdlib.h>
标准的平台,极端谨慎无疑是当务之急。
脚注:如果malloc()
不在<stdlib.h>
中,真正的答案是检查文档,检查代码中是否有一些愚蠢的错误(例如,似乎包含<stdlib.h>
,但由于条件编译逻辑中的错误而没有),然后提出问题。10比1你有一些业余编译器,也许你应该修复<stdlib.h>
作为对项目的一种帮助。