我想在必须跨平台的C程序中使用malloc()
。但是-在哪里?我知道C89和C99语言标准要求可以通过<stdlib.h>
使用它,但是-某些平台没有它。我注意到在某些情况下它可能位于<malloc.h>
中,并且读到它可能位于<malloc/malloc.h>
中。
我的问题:哪些平台在哪个位置具有malloc()
?特别是我提到的三个位置?
注意:请不要建议我使用跨平台开发框架,这与我的情况无关。
答案 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>
以使该项目受益。