使用malloc out of main

时间:2014-05-28 08:24:43

标签: c arrays malloc

我需要声明一个全局大小的数组。 我试图使用malloc out 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);
}

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

3 个答案:

答案 0 :(得分:2)

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

简单的答案是,您的malloc来电应该进入main功能。

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

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

double data[HUGE];

int main() {
    // ...
}

此数组具有静态存储持续时间(与本地变量的自动存储持续时间相反),并且实际上没有静态存储的大小限制。实际上,全局对象的内存在程序加载时已被搁置,并且根本不是动态管理内存的一部分。

答案 1 :(得分:1)

在可执行部分中需要特殊的位置来分配内存(我发现你理解了这种解除分配的想法)。但是你可以声明变量anyware。

所以,解决方案如下:

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);
}

答案 2 :(得分:0)

Malloc和free只能在执行期间将内存分配并释放到堆内存区域,因此在main函数中使用它们是不正确的。

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