【问题标题】:Malloc function (dynamic memory allocation) resulting in an error when it is used globallymalloc 函数(动态内存分配)在全局使用时导致错误
【发布时间】:2011-10-08 05:46:30
【问题描述】:
#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 &lt;stdlib.h&gt;,这样你就可以得到malloc() 的正确声明(没有它,你的“工作”代码在大多数 64 位系统上都会出错) .

标签: c malloc global-variables dynamic-memory-allocation


【解决方案1】:

您不能在函数之外执行代码。在全局范围内您唯一能做的就是声明变量(并使用编译时常量对其进行初始化)。

malloc是一个函数调用,所以在函数外是无效的。

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

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

【讨论】:

  • 那么我如何将动态分配的内存设为全局内存?没有可能这样做?
  • 是的,您的第二个示例就是这样做的。
  • 更具体地说,malloc 分配的内存是“全局”的,因为任何具有指向该地址的指针的函数都可以访问它。通过在所有函数之外声明“y”,其他函数可以访问它。为了理解差异,假设一个函数刚刚调用了 malloc 并返回了结果。当函数返回时,内存仍然被分配。
【解决方案2】:

好吧,这与全局使用 malloc 无关。您的 malloc 进程必须驻留在任何函数、主函数或任何其他用户定义的函数中。在全球范围内,您只能取消变量。由于 'y' 是全局声明的,因此 malloc 是一个函数调用。必须驻留在任何函数中。不仅是 malloc,你不能像你在这里调用的那样调用任何函数。您只能在此处将函数声明为全局或本地

【讨论】:

  • 还有一件事,没有什么能比得上“全局分配内存”。如果您的变量是全局变量,例如本例中的 y,那么您的内存分配将始终全局生效,无论您在哪里调用 malloc 函数,但在任何函数中调用 malloc
【解决方案3】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 2013-11-20
    • 2018-10-16
    • 1970-01-01
    • 2013-09-23
    相关资源
    最近更新 更多