在主程序外使用malloc



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

但是我收到这个错误:初始化器元素不是常量。有人知道怎么解决这个问题吗?

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

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

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

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

double data[HUGE];
int main() {
    // ...
}

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

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

所以,解决方案如下:

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

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

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

相关内容

  • 没有找到相关文章

最新更新