В соответствии с декларацией int** test;
, test
- pointer to pointer и код, выделяющий память для матрицы значений int динамически с использованием функции malloc.
Заявление:
test = (int **)malloc(k * sizeof(int*));
// ^^------^^-------
// allocate for k int* values
Выделяют продолжают память для k
указателей на INT (int*
). Поэтому предположит, если k = 4
то получает что-то вроде:
temp 343 347 351 355
+----+ +----+----+----+----+
|343 |---►| ? | ? | ? | ? |
+----+ +----+----+----+----+
Я предполагаю, что адрес из четырех байт и ?
означает значение мусора.
temp
переменный присвоенный возвращенный адрес malloc, malloc выделяет сохраняемые блоки памяти размера = k * sizeof(int**)
, что в моем примере = 16 байт.
В цикле for вы назначаете память для k
int и присваиваете возвращенный адрес temp[i]
(местоположение ранее выделенного массива).
test[i] = (int*)malloc(k * sizeof(int)); //Initialize all the values
// ^^-----^^----------
// allocate for k int values
Примечание: выражение temp[i]
== *(temp + i)
. Таким образом, в течение цикла в каждой итерации вы выделить память для массива значений Int K, который выглядит, как показано ниже:
First malloc For loop
--------------- ------------------
temp
+-----+
| 343 |--+
+-----+ |
▼ 201 205 209 213
+--------+ +-----+-----+-----+-----+
343 | |= *(temp + 0) | ? | ? | ? | ? | //for i = 0
|temp[0] |-------| +-----+-----+-----+-----+
| 201 | +-----------▲
+--------+ 502 506 510 514
| | +-----+-----+-----+-----+
347 |temp[1] |= *(temp + 1) | ? | ? | ? | ? | //for i = 1
| 502 |-------| +-----+-----+-----+-----+
+--------+ +-----------▲
| | 43 48 52 56
351 | 43 | +-----+-----+-----+-----+
|temp[2] |= *(temp + 2) | ? | ? | ? | ? | //for i = 2
| |-------| +-----+-----+-----+-----+
+--------+ +-----------▲
355 | |
| 9002 | 9002 9006 9010 9014
|temp[3] | +-----+-----+-----+-----+
| |= *(temp + 3) | ? | ? | ? | ? | //for i = 3
+--------+ | +-----+-----+-----+-----+
+-----------▲
Опять ?
означает значение мусора.
Дополнительные пункты:
1) Вы литейная возвращается адрес, таНос, но в C следует избегать. Читайте Do I cast the result of malloc? просто сделайте следующее:
test = malloc(k* sizeof(int*));
for (i = 0; i < k; i++){
test[i] = malloc(k * sizeof(int));
}
2) Если вы выделения памяти динамически, вы должны освободить память явно, когда ваша работа с этим (после освобождения динамически распределяемой памяти, вы не можете получить доступ к этой памяти). Шаги к свободной памяти для test
будут выглядеть следующим образом:
for (i = 0; i < k; i++){
free(test[i]);
}
free(test);
3) Это один способ выделения памяти для 2D-матрицы как массив массивов, если вы хотите выделить полностью продолжает памяти для всех массивов проверить этот ответ: Allocate memory 2d array in function C
4) Если описание помогает, и вы хотите узнать для 3D выделения Проверьте этот ответ: Matrix of String or/ 3D char array
Я надеюсь, что ваш учитель также показал вам, как выделить multidimenional массив все естественно, как построить на язык, и Ждут» t покажу вам эту эмуляцию 2D как первого бита под подставные массивы и указатели. Но так или иначе он показывает вам код, на которого многие недовольны: в C вы не будете бросать возвращаемое значение 'malloc' и, во что бы то ни стало, вы не научили бы кого-либо использовать броски на таком раннем этапе понимания языка , –