На самом деле есть несколько способов сделать это sh. Чтобы найти лучший способ и хорошее объяснение того, почему это лучший способ, вы можете прочитать это Правильное размещение многомерных массивов (спасибо Лундин)
Оповещение о спойлере, код в вопросе определенно не лучший способ go об этом по многим причинам, но короткая версия такова: при таком подходе это технически не 2d массив, а память разбросана по куче. Это создает проблемы при выполнении арифметики с указателями c, при использовании встроенных функций, таких как memcpy и многих других. Снова прочитайте стек выше для длинного и превосходного объяснения.
Тем не менее, если вы хотите сделать это по-своему, сначала вы должны malloc
пространство для n раз размер указателя на int, так что A = malloc(n * sizeof(int*))
, а затем для каждого i
элемента, который вы можете выделить буфер, в m раз больше, чем int, так что A[i] = malloc(m * sizeof(int))
. На самом деле, читая это, вы можете увидеть, как каждый mallo c оказывается в случайном месте в куче.
Возможно, эта таблица Ascii делает ее немного более понятной.
A[i] A[0] A[1] A[2] A[3] A[4] A[...]
*A -> [int*, int*, int*, int*, int*, ...]
| | | | | |
v v v v v v
____ ____ ____ ____ ____ ____
A[i][1] |int ||int ||int ||int ||int ||... |
A[i][2] |int ||int ||int ||int ||int ||... |
A[i][3] |int ||int ||int ||int ||int ||... |
A[i][4] |int ||int ||int ||int ||int ||... |
... |... ||... ||... ||... ||... ||... |
A has the address of A[0], so A == &A[0]
*A gives the value of A[0], so *A == A[0]
A[0] has the address of A[0][0], so A[0] == &A[0][0]
*A[0] gives the value of A[0][0], so *A[0] == A[0][0]
**A is the same as A[0][0], so **A == A[0][0]
Вы также можете представьте себе путь указателя, это также объясняет, почему вы используете указатель на указатель **A
. Когда вы обращаетесь к элементу таким способом, вы делаете это:
*A
указывает на первый элемент буфера int*
, поэтому, если вы сделаете
printf("This is the address of the int A[0][0]: %p\n", *A);
, вышеприведенное получит вы адрес элемента A [0] [0] в памяти, и если вы будете следовать этому указателю, то есть
printf("This is the value of the int A[0][0]: %d\n", **A);
, вы фактически получите его значение.