取malloc()、realloc()和free()的地址是否可移植?

按照标准,它是安全采取的地址malloc()realloc()free()

例如,

#include <stdlib.h>
void * (*my_malloc)(size_t) = &malloc;

推论,是否有可能在符合标准-C的实现使用宏malloc/ realloc/ free

回答

是的,这是安全的。标准库可以为它的任何函数定义类似函数的宏,但它们也必须作为函数可用。

C17 7.1.4 (1)

在头文件中声明的任何函数都可以额外实现为在头文件中定义的类函数宏,因此如果在包含其头文件时显式声明了库函数,则可以使用下面显示的技术之一来确保声明不是受这样的宏影响。函数的任何宏定义都可以通过将函数名称括在括号中来局部抑制,因为该名称后面没有左括号,表示宏函数名称的扩展。出于相同的句法原因,即使库函数也被定义为宏,也允许获取库函数的地址。[189]

[189] 这意味着一个实现应该为每个库函数提供一个实际的函数,即使它也为那个函数提供了一个宏。

简而言之,库的标题允许具有类似的内容

void *malloc(size_t);
#define malloc(s) __fancy_internal_malloc((s) + 47 | 0x14 * 3)

然后你可以做任何

void *p = malloc(10); // invokes the macro if there is one
void *q = (malloc)(10); // definitely calls the function, not the macro
void *(*allocator)(size_t) = &malloc; // takes address of the function
#undef malloc
void *r = malloc(10); // definitely the function

当然,函数和宏都必须提供标准承诺的任何行为(尽管正如 Eric Postpischil 评论的那样,只要每个人都符合要求,它们的行为就不必相同)。特别是,用宏分配和用函数释放必须是安全的,反之亦然。此外,这样的宏必须对它的每个参数只计算一次,因此p = malloc(s++);对于函数或宏来说都是安全的。


以上是取malloc()、realloc()和free()的地址是否可移植?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>