全局使用Malloc函数(动态内存分配)时出现错误

12
#include<stdio.h>
#include<string.h>
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语句放在主函数或其他函数中就没有错误。这是为什么呢?

#include<stdio.h>
#include<string.h>
char *y;
int main()
{
    y=(char *)malloc(40); 
    strcpy(y,"hello world");
}

除了Mat的回答外,不要忘记#include <stdlib.h>以获得对malloc()的正确声明(如果没有它,你的“工作”代码在大多数64位系统上都会有错误)。 - Michael Burr
3个回答

28

你无法在函数外部执行代码。在全局范围内唯一能做的是声明变量(并用编译时常量初始化它们)。

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

如果你在主函数(或任何其他函数)中使用 malloc 初始化了一个全局指针变量,那么该变量将在该变量作用域内的所有其他函数中都可用(在你的示例中,是包含 main 的文件中的所有函数)。

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


那么我如何将动态分配的内存作为全局变量?没有可能吗? - niko
5
是的,你的第二个例子正是如此。 - Mat
更具体地说,malloc分配的内存是“全局”的,这意味着任何具有指向该地址的指针的函数都可以访问它。通过在所有函数之外声明“y”,其他函数可以访问它。为了理解区别,假设一个函数只调用了malloc并返回结果。当函数返回时,内存仍然被分配。 - Foo Bah

1

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

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

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

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


1

嗯,这不是关于全局使用 malloc。你的 malloc 进程必须驻留在任何函数中,包括主函数或任何其他用户定义的函数。全局范围内,您只能声明变量。由于“y”被全局声明,malloc 是一个函数调用。它必须驻留在任何函数内部。不仅如此,您不能像此处一样调用任何函数。您只能在那里声明函数为全局或本地函数


还有一件事,不存在“全局分配内存”的情况。如果您的变量是全局的,比如这个例子中的y,那么您的内存分配将始终在全局范围内生效,无论您在哪个函数中调用malloc函数,都会生效。 - DTdev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接