定义我自己的 malloc 后出现分段错误?

run*_*oad 2 c malloc gcc built-in segmentation-fault

为什么这会导致分段错误?

#include <stddef.h>
       
void *malloc(size_t s) {           
};                                                                                                    
int main() {  
  printf("lol");           
}
Run Code Online (Sandbox Code Playgroud)

这就是我的编译方式:

gcc -o l lol.c
Run Code Online (Sandbox Code Playgroud)

我的猜测是printf()调用malloc().

Joh*_*ger 7

根据 C 语言规范,将您自己的标准库函数定义提供为具有外部链接的函数(这是函数的默认设置)会产生未定义的行为。这些名称保留用于此类用途(C17 7.1.3)。您观察到了此类行为的多种可能表现之一。

你至少有四种选择:

  1. 只需使用标准库的实现即可。
  2. 使用不同的名称定义您的函数。例如,my_malloc()。然后,您将需要使用该名称来调用它,尽管您可以使用宏来伪装它。
  3. 声明您的函数static(为其提供内部链接)。然后它可以与标准库函数具有相同的名称,但只有在同一翻译单元(大致:源文件)中定义的函数才能通过该名称调用它。
  4. 参与特定 C 实现的特定于实现的规定(见下文)。

一些 C 实现为程序提供了特定于实现的规定,以提供至少一些库函数的自己的版本。 Glibc 就是其中之一。然而,此类规定受到重大限制。

  • 首先也是最重要的,您可以预期实现将要求替换函数提供相同的二进制接口并正确实现语言指定的行为。(你的函数不执行后者。)

  • 其次,如果该函数是一组相关函数的一部分,malloc您可能会发现该实现需要您替换整个集合。事实上,Glibc 文档说“替换 malloc”涉及为所有这些函数提供替换:malloc, free, calloc, realloc。你的程序也不会这样做。Glibc 文档建议还提供其他几个函数的替代品,并建议如果不这样做,虽然本身不​​会损害任何 Glibc 函数,但可能会破坏某些程序:aligned_alloc, cfree, * malloc_usable_size , memalign, posix_memalign, pvalloc, valloc。然而,后者与您的特定示例无关。


*仅非常老的程序需要。