В предоставленном вами примере кода переменные rows
и columns
не были инициализированы перед использованием, поэтому они могут содержать что угодно, но, скорее всего, будут равны 0. В любом случае, как написано, результаты всегда будутбыть непредсказуемым.
Когда в C необходим массив 2D , полезно инкапсулировать распределение памяти и освобождение памяти в функции, чтобы упростить задачу и улучшить читаемость.Например, в вашем коде следующая строка создаст массив из 5 указателей, каждый из которых будет указывать на 20 int
мест хранения: (создание 100 адресуемых адресов int
мест.)
int main(void)
{
struct mystruct result = {0};
result.my2darray = Create2D(5, 20);
if(result.my2darray)
{
// use result.my2darray
result.my2darray[0][3] = 20;// for simple example, but more likely in a read loop
// then free result.my2darray
free2D(result.my2darray, 5);
}
return 0;
}
Использование следующихдве функции:
int ** Create2D(int c, int r)
{
int **arr;
int y;
arr = calloc(c, sizeof(int *)); //create c pointers (columns)
for(y=0;y<c;y++)
{
arr[y] = calloc(r, sizeof(int)); //create r int locations for each pointer (rows)
}
return arr;
}
void free2D(int **arr, int c)
{
int i;
if(!arr) return;
for(i=0;i<c;i++)
{
if(arr[i])
{
free(arr[i]);
arr[i] = NULL;
}
}
free(arr);
arr = NULL;
}
Имейте в виду, что то, что вы создали с помощью этой техники, на самом деле представляет собой 5 различных позиций указателя, каждое из которых указывает на набор из 20 int
положений.Это то, что облегчает использование массива, как индексация, то есть мы можем сказать, что result.my2darray[1][3]
представляет второй столбец , четвертая строка элемент массива 5X20, когда он на самом деле не является массивомвообще.
int some_array[5][20] = {0};//init all elements to zero
- это , что обычно упоминается в массиве C * int
, также позволяя доступ к каждому элементу посредством индексации.В действительности (хотя обычно упоминается как массив.) Это не массив.Расположение элементов в этой переменной хранится в одном смежном месте в памяти.
|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0... (~ 82 more)
Но C поддерживает местоположения так, что все они индексируются как двумерный массив.