哪个标头在哪个平台上定义了malloc()?

时间:2019-02-11 11:31:47

标签: c malloc header-files multiplatform

我想在必须跨平台的C程序中使用malloc()。但是-在哪里?我知道C89和C99语言标准要求可以通过<stdlib.h>使用它,但是-某些平台没有它。我注意到在某些情况下它可能位于<malloc.h>中,并且读到它可能位于<malloc/malloc.h>中。

我的问题:哪些平台在哪个位置具有malloc()?特别是我提到的三个位置?

注意:请不要建议我使用跨平台开发框架,这与我的情况无关。

2 个答案:

答案 0 :(得分:1)

所有符合条件的 托管 C实现均在malloc中包含<stdlib.h> 独立的实现不需要 即可提供<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

答案 1 :(得分:1)

问题表明标准要求在<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);

在某些平台上,malloc()的声明可能有所不同(例如,不同的调用约定)。

鉴于我们已经在谈论一个不合规的平台,该平台未在<stdlib.h>中声明它,因此,非常谨慎是当务之急。

脚注::如果malloc()中没有<stdlib.h>,真正的答案是检查文档,检查代码中是否存在一些愚蠢的错误(例如,似乎包含{{1 }},但不是由于条件编译逻辑中的错误而引起的),则发出票证。 10:1,您已经有了一些业余爱好者的编译器,也许您应该修复<stdlib.h>以使该项目受益。