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

Malloc函数(动态内存分配)在全局使用时导致错误,c,malloc,global-variables,dynamic-memory-allocation,C,Malloc,Global Variables,Dynamic Memory Allocation,现在真正的问题是,我们不能全局地进行动态内存分配吗?为什么全局使用malloc时会显示错误?如果我把malloc语句放在主函数或其他函数中,代码就不会出错。为什么会这样 error: conflicting types for 'y' error: previous declaration of 'y' was here warning: initialization makes integer from pointer without a cast error: initializer ele

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

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
#包括
#包括
char*y;
int main()
{
y=(char*)malloc(40);
strcpy(y,“你好,世界”);
}

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

malloc
是函数调用,因此在函数外部无效

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


(请注意,在可能的情况下应避免使用全局变量。)

好吧,这不是全局使用malloc。您的malloc进程必须位于任何函数、main函数或任何其他用户定义函数中。在全局范围内,只能删除变量。由于“y”是全局声明的,所以malloc是一个函数调用。它必须驻留在任何函数中。不仅malloc,u不能像您在这里调用的那样调用任何函数。只能将函数声明为全局或局部

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

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

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

从编译器的角度来看,使用
初始化运算符=,并使用赋值运算符=。

那么如何使动态分配的内存成为全局内存?不可能这样做?是的,您的第二个示例就是这样做的。更具体地说,malloc分配的内存是“全局”的,即任何具有地址指针的函数都可以访问它。通过在所有函数之外声明“y”,其他函数可以访问它。为了理解差异,假设一个函数刚刚调用malloc并返回结果。当函数返回时,内存仍然是分配的。除了Mat的答案之外,不要忘了
#include
,这样你就可以得到
malloc()
的正确声明(没有它,你的“工作”代码在大多数64位系统上都会有问题)。还有一件事,没有什么比“全局分配内存”更好的了。如果您的变量是全局变量,如本例中的y,则内存分配将始终在全局范围内生效,无论您调用malloc函数,还是在任何函数中调用malloc
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
#include<stdio.h>
#include<string.h>
char *y;
int main()
{
    y=(char *)malloc(40); 
    strcpy(y,"hello world");
}