C函数malloc()在stdlib.h下定义 如果我们不包含此文件,它应该给出错误但是这个代码可以正常工作并发出一点警告。我的问题是,如果malloc()在没有此头文件的情况下工作,那么为什么要包含它呢?请清楚我的概念。
# include <stdio.h>
int main()
{
int a, b, *p;
p = (int*)malloc(sizeof(int)*5);
for(a=0;a<5;a++)p[a]=a*9;
for(b=0;b<5;b++)printf("%d ",p[b]);
}
答案 0 :(得分:11)
在C中,遗憾的是您不需要预先声明函数。如果编译器遇到一个新函数,它将为它创建一个隐式声明(“mmm`kay,这是如何使用它所以我将假设参数的类型是..”)。
不要依赖这个“功能”,一般不要编写编译警告的代码。
答案 1 :(得分:4)
阅读警告。它说这是无效的。编译器对你太好了。在Clang中,这可行,但在其他编译器中可能没有。
至少包含它来压制警告。不必要的警告令人讨厌。任何程序都应该编译并将警告视为错误(我总是启用它)。
答案 2 :(得分:3)
这似乎是你的编译器的魔力。不包括必要的标题可能适用于您的编译器(我想是由Microsoft),但它不一定在别处编译(包括同一编译器的未来版本)。编写符合标准的可移植代码。
答案 3 :(得分:2)
与c中的许多内容一样,由于历史原因,没有原型时不会生成错误。在早期,人们通常不打扰原型函数,因为指针和整数通常是相同的大小,小于整数的整数类型在作为参数传递时被提升为整数(并且浮点很少用于系统编程)。
如果某个函数没有原型化,那么在任何时候他们都改变了编译器以给出错误,那么它会破坏许多程序并且不会得到广泛接受。
对于64位寻址,我们现在进入一个整数和指针大小不同的时期,如果没有像malloc()那样返回指针的函数原型,程序很可能会中断。
在gcc中,始终为您自己的程序设置以下选项:-Werror -Wstrict-prototypes
答案 4 :(得分:2)
stdlib.h是通用标准头文件,包括动态内存分配和其他标准函数的功能。
例如,如果要在程序执行结束时显示消息,则需要使用getch()函数,此函数从键盘读取字符,从而为用户提供读取显示信息的时间
getch()函数需要包含stdlib标头。