double *Array = NULL;
Это хорошо (если вы включили заголовок, который определяет NULL, прежде чем писать).
Array = malloc(dim1 * dim2 * sizeof(double));
Вы говорите, что это дает:
Error: Conflicting types for Array
Error: Initializer element is not constant
Это потому, что компилятор наклоняется назад, чтобы принять ваш код, и ему удается интерпретировать Array
как неявную переменную int
, как если бы вы написали:
int Array = ...
Поскольку int
не совпадает с double *
, выдается ошибка конфликтующих типов.
Второе сообщение говорит вам, что инициализатор - вызов malloc()
- не является константой, и инициализаторы вне функций должны быть константами. Если вы поместите строку внутри функции, то у вас будет присваивание (не инициализатор), и код будет в порядке, хотя лучше записать как:
if (Array == NULL)
Array = malloc(dim1 * dim2 * sizeof(double));
Вы должны компилировать с более строгими предупреждениями компиляции. Я получаю:
$ cat x.c
#include <stdlib.h>
double *Array = NULL;
Array = malloc(23 * 37 * sizeof(double));
$ gcc -g -std=c99 -pedantic -Wall -Werror -c x.c
x.c:3:1: error: data definition has no type or storage class [-Werror]
x.c:3:1: error: type defaults to ‘int’ in declaration of ‘Array’ [-Werror]
x.c:3:1: error: conflicting types for ‘Array’
x.c:2:9: note: previous definition of ‘Array’ was here
x.c:3:9: error: initialization makes integer from pointer without a cast [-Werror]
x.c:3:1: error: initializer element is not constant
cc1: all warnings being treated as errors
$