c-哪个标头在哪个平台上定义malloc()



我想在必须跨平台的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>作为对项目的一种帮助。

相关内容

  • 没有找到相关文章

最新更新