【问题标题】:use malloc out of main在 main 之外使用 malloc
【发布时间】:2014-05-28 08:24:43
【问题描述】:

我需要声明一个全局大数组。 我尝试使用 malloc out of ouf main:

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#define LENGTH 200000

double *u_data = malloc(LENGTH * sizeof(double));
double *u_data_old = malloc(LENGTH * sizeof(double));
double *psi = malloc(LENGTH * sizeof(double));

void main(void){

    free(u_data);
    free(u_data_old);
    free(psi);
}

但我收到此错误:初始化程序元素不是常量。 有谁知道如何解决这个问题?

【问题讨论】:

  • 真正的全局数组怎么样:double u_data[LENGTH];

标签: c arrays malloc


【解决方案1】:

在 C 中,执行从 main 函数开始,在此之前没有运行动态全局初始化程序的机制(与 C++ 不同)。这意味着全局变量只能使用编译时常量表达式进行初始化,而不能使用需要动态确定的值。

简单的答案是您的malloc 调用应该移到main 函数中。

void * p;
int main() {
    p = malloc(X);
    // ...
    free(p);
}

但是,这甚至可能不是必需的。如果你想要一个固定的空间,你可以简单地定义一个全局数组:

double data[HUGE];

int main() {
    // ...
}

该数组具有静态存储时长(与局部变量的自动存储时长相反),并且几乎没有静态存储的大小限制。实际上,全局对象的内存在程序加载时就已经预留出来了,它根本不是动态管理内存的一部分。

【讨论】:

    【解决方案2】:

    您需要在可执行部分中分配内存的特殊位置(我看到您理解这个释放的想法)。但是您可以随时声明变量。

    所以,解决方案如下:

    double *u_data = NULL;
    double *u_data_old = NULL;
    double *psi = NULL;
    
    void main(void){
        u_data = malloc(LENGTH * sizeof(double));
        u_data_old = malloc(LENGTH * sizeof(double));
        psi = malloc(LENGTH * sizeof(double));
    
        {...}
    
        free(u_data);
        free(u_data_old);
        free(psi);
    }
    

    【讨论】:

      【解决方案3】:

      malloc和free只能在执行时向堆内存区域分配和释放内存,所以在main函数之外使用它们是不正确的。

      解决方案是 ilya 提供的代码:声明全局变量并从主函数初始化它们。

      【讨论】:

      • mallocfree 只能在执行期间向堆内存区域分配和释放内存”,这100% 正确吗?其他函数仍然存在于执行时,因此将malloc 放在其他函数中仍然会使其在执行时被调用。我错了吗?
      猜你喜欢
      • 2015-06-08
      • 2018-10-04
      • 2017-05-17
      • 1970-01-01
      • 2012-12-27
      • 2021-05-17
      • 2016-02-18
      • 1970-01-01
      • 2019-06-21
      相关资源
      最近更新 更多