我正在阅读A Koenig的一本名为C Traps and Pitfalls的旧书,该书于1989年出版,就在第一个C标准之前。在其中,我找到了以下代码:
char *r, *malloc();
r = malloc(strlen(s) + strlen(t) + 1);
第一行无法正确编译; 我使用CodeBlocks与MinGW编译它,它给我以下错误信息:
||=== Build: Debug in beta (compiler: GNU GCC Compiler) ===|
C:\Users\ADMIN\Desktop\beta\beta\main.c||In function 'main':|
C:\Users\ADMIN\Desktop\beta\beta\main.c|9|error: conflicting types for 'malloc'|
C:\Program Files (x86)\CodeBlocks\MinGW\include\stdlib.h|356|note: previous declaration of 'malloc' was here|
||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
我学到了一些C,但我不知道" char * malloc()"以及编译器发出错误的原因。
答案 0 :(得分:7)
char *malloc();
是K& R C函数声明。我们将其称为K& RC,因为它是由Kernighan和Ritchie在1980年左右出版的第一版 The C Programming Language 中描述的C语言。该声明称“malloc存在,返回{{ 1}}并且可能会也可能不会采用参数“。
1990年,第一个官方C标准出版。与K * R样式C相比,最大的改进之一是引入了函数原型,其中也可以声明参数的类型。另一个是char*
类型的引入,因此也是void
。自1990年以来,C头文件void *
已对stdlib.h
malloc
这与你的重新声明有不同的返回类型,因此错误。
你的书C陷阱和陷阱is 27 years old以及三个过时的标准(C90,C99,C11)。得到一本新书。