【问题标题】:Which header defines malloc() on which platform?哪个标头在哪个平台上定义了 malloc()?
【发布时间】:2019-02-11 11:31:46
【问题描述】:

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

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

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

【问题讨论】:

  • 查看您平台中的库文档。
  • 按照标准应该在stdlib.h
  • @SouravGhosh:我在 my 平台上很好,关键是我希望代码可以在我以外的平台上运行......我确实说过标准要求它位于<stdlib.h>
  • 您能否提供一个在stdlib.h 中未声明malloc 的平台示例?
  • @einpoklum,您提供的链接仅显示您的构建日志,其中明确指出未找到 。再次尝试使用 ,或者更新项目中的搜索路径

标签: c malloc header-files multiplatform


【解决方案1】:

所有符合的托管 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

【讨论】:

  • @EricPostpischil 对,先生。相应地进行了编辑。但是,OP 提供了在 cmets 中构建输出的链接,这显然是一个托管实现。
【解决方案2】:

正如问题所述,标准要求在<stdlib.h> 中声明它。 我建议检查您的文档。标准是它必须在该标头中声明,但可以在其他标头中声明(直接或间接)。

如果您的目标是一些不符合标准的平台,而该平台未在 <stdlib.h> 中声明,那么显而易见的答案是 #include<stdlib.h>。这样你就可以很好地适应兼容的平台和你所知道的古怪球。

您甚至可以拥有另一个标题。假设它只在<string.h> 中声明,那么您可以在您的项目"stdlibfix.h" 中定义一个标头:

#include <string.h>
#include <stdlib.h>

注意:省略了标题保护,实际上这里不需要。

如果存在于&lt;memory.h&gt;等一些非标准头文件中,则使用条件编译。大多数编译器都定义了一些标识自己的宏,例如 SMITH_COMPILER 然后你需要

#ifdef SMITH_COMPILER
#include <memory.h>
#endif

您甚至可能会遇到不允许动态内存分配的平台,例如小型嵌入式平台。你如何处理它超出了这里的范围,除了通常最好避免它而不是实现它。在此类应用程序中,您可以并且应该计算最大存储需求并将它们实现为变量和固定大小的数组。

避免仅仅声明它的原型:

void *malloc(size_t sz);

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

鉴于我们已经在讨论一个未在 &lt;stdlib.h&gt; 中声明的不合规平台,因此绝对要格外小心。

脚注:如果malloc() 不在&lt;stdlib.h&gt; 中,真正的答案是检查文档,检查您的代码是否存在一些愚蠢的错误(例如,似乎包含&lt;stdlib.h&gt;,但没有由于条件编译逻辑错误)然后提出票证。 10 比 1 你有一些业余编译器,也许你应该修复 &lt;stdlib.h&gt; 作为对项目的帮助。

【讨论】:

    猜你喜欢
    • 2023-02-10
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    相关资源
    最近更新 更多