Эта ваша декларация не работает:
int *array[][]; // this is a pointer to a 2-dimensional array??
Сначала он пытается объявить двумерный массив int *
. Во-вторых, когда вы объявляете или определяете массив, должны быть указаны все размеры, кроме первого (size).
int (*array)[][2]; // This is a pointer to a 2D array of unknown size
Теперь это можно использовать в основном варианте вашей функции. Это вариант, потому что я сначала неправильно понял ваш вопрос.
void load(void)
{
...
int tempArray[n][2]; // Note the reversed order of dimensions!
...
array = &tempArray;
...there must be some code here calling functions that use array...
array = 0;
}
Обратите внимание, что для присвоения требуется &
в имени массива. В других функциях вам нужно написать:
n = (*array)[i][j];
Обратите внимание, что присвоение адреса локального массива глобальной переменной опасно. Как только функция load()
вернется, область хранения для tempArray
больше не будет действительной. Следовательно, единственный безопасный способ сделать присваивание - это затем вызвать функции, которые ссылаются на глобальную переменную, и затем сбросить глобальную переменную перед выходом из функции. (Или, по крайней мере, признайте, что значение недопустимо. Но установка его в ноль - нулевой указатель - скорее обеспечит сбой программы, чем просто доступ к случайной памяти.
В качестве альтернативы вам нужно получить динамическое выделение памяти для массива.
Ваш вопрос на самом деле хочет сделать глобальный указатель на VLA, массив переменной длины, где размерность переменной не первая:
int tempArray[2][n]; // Note the reversed order of dimensions!
Вы просто не можете создать глобальный указатель на такой массив.
Итак, есть несколько проблем:
- Обозначение указателей на массивы
- Инициализация указателей на массивы
- Назначение глобальных указателей локальным переменным
- Вы не можете иметь глобальные указатели на многомерные VLA, где переменные длины не в первом измерении.
- Вы должны минимизировать использование глобалов.