Чтобы массив сохранялся в памяти, его необходимо либо объявить static
, либо его следует явно выделить с помощью malloc
или calloc
(каждое решение имеет функциональные последствия - то есть версия static
будет перезаписать при следующем вызове функции, и выделенная версия должна быть явно освобождена позже, чтобы избежать утечек памяти).
Обратите внимание, что указатели и массивы - это не одно и то же в C, и, поскольку вы имеете дело с динамическим размещением в случае malloc
, вы будете работать с указателями. Ссылка на элементы массива с использованием этих указателей будет функционально такой же, как ссылка на элементы массива, поэтому вы не должны заметить разницы после создания массива.
Вот пример, который выделяет, заполняет и возвращает двумерный массив, используя один malloc
(как для эффективности, так и для разрешения использования одного free
для освобождения):
int **get2dArray(int rows, int cols)
{
int **array2d;
int i, j, offset;
int *gridstart;
offset = rows * sizeof(int *);
array2d = malloc( offset + rows*cols*sizeof(int) );
/* Demote to char for safe pointer arithmetic */
gridstart = (int *)((char *)array2d + offset);
for ( i = 0; i < rows; i++ ) {
/* Point to the proper row */
array2d[i] = gridstart + i*cols;
/* Populate the array -- your code goes here */
for ( j = 0; j < cols; j++ ) {
array2d[i][j] = i*cols + j;
}
}
return array2d;
}
int main ( int argc, char **argv )
{
int **testarray;
testarray = get2dArray( 10, 100 );
/* Verify that addressing and population went as planned */
printf( "%d %d %d %d %d %d\n", testarray[0][0], testarray[2][55],
testarray[4][98], testarray[5][0], testarray[7][15],
testarray[9][99] );
free(testarray);
return 0;
}
Есть много других способов сделать это, но это демонстрирует функцию, которая возвращает двумерный указатель "массив".