Malloc函数(动态内存分配)在全局使用时导致错误

#include #include char *y; y=(char *)malloc(40); // gives an error here int main() { strcpy(y,"hello world"); } 

 error: conflicting types for 'y' error: previous declaration of 'y' was here warning: initialization makes integer from pointer without a cast error: initializer element is not constant warning: data definition has no type or storage class warning: passing arg 1 of `strcpy' makes pointer from integer without cast 

现在真正的问题是,我们不能在全球范围内进行动态内存分配吗? 为什么在全局使用malloc时会出现错误? 如果我将malloc语句放在main函数或其他函数中,代码就没有错误。 为什么会这样?

 #include #include char *y; int main() { y=(char *)malloc(40); strcpy(y,"hello world"); } 

您无法在函数之外执行代码。 您可以在全局范围内做的唯一事情是声明变量(并使用编译时常量初始化它们)。

malloc是一个函数调用,因此函数外部无效。

如果使用来自main(或任何其他函数)的malloc初始化全局指针变量,它将可用于该变量在范围内的所有其他函数(在您的示例中,包含main的文件中的所有函数)。

(请注意,应尽可能避免使用全局变量。)

好吧,它不是关于在全球范围内使用malloc。 您的malloc进程必须驻留在任何函数,main或任何其他用户定义的函数中 。 在全球范围内,您只能对变量进行去除。 由于’y’是全局声明的,malloc是一个函数调用。 必须驻留在任何函数内部。 不仅是malloc, 你不能调用任何函数,就像你在这里调用的那样。 你只能在那里声明全局或本地function

初始化静态或全局变量时,不能使用函数调用。 在下面的代码序列中,我们声明一个静态变量,然后尝试使用malloc初始化它:

static int *pi = malloc(sizeof(int));

这将生成编译时错误消息。 全局变量也会发生同样的事情,但可以通过使用单独的语句为变量分配内存来避免静态变量,如下所示。 我们不能对全局变量使用单独的赋值语句,因为全局变量是在函数之外声明的,可执行代码(例如赋值语句)必须在函数内部: static int *pi; pi = malloc(sizeof(int)); static int *pi; pi = malloc(sizeof(int));

从编译器的角度来看,使用初始化运算符=和使用赋值运算符=之间存在差异。