我需要声明一个全局大数组。我尝试使用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函数初始化它们。