我需要声明一个全局大小的数组。 我试图使用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);
}
但我收到此错误:初始化元素不是常量。 有谁知道如何解决这个问题?
答案 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函数初始化它们。