Однако каждый раз, когда я ссылаться на собственные [я] [J], я получаю сообщение об ошибке говоря, что индексированное значение не является ни массивом, ни указателем, ни вектором.
Правильно. own[i]
эквивалентно *(own + i)
, который имеет тип int
. Вы не можете применить оператора индекса к int
.
Обратите внимание, что то, что ваш код пытается создать, - это не двумерный массив, а массив указателей. Если это действительно то, чего вы хотите, то own
должен иметь тип int **
, и вы должны соответствующим образом отрегулировать первый вызов calloc()
. Если вы действительно хотите, динамическое выделение 2D-массива, хотя, то это было бы:
int (*own)[3];
own = calloc(mem_size, sizeof(*own));
Обратите внимание, что нет необходимости, то выделить (или бесплатно) строки отдельно.
Следует также отметить, однако, что если вы никогда не должны перераспределить own
, прежде чем она выходит из области видимости, если можно предположить, по крайней мере, C99 компилятор, и если mem_size
это никогда не будет слишком большим, то вы можете сделать это еще более легко с помощью массива переменной длины:
int own[mem_size][3] = {{0}};
Нет явного динамического выделения или открепление необходимо вообще в этом случае, и инициализатор может быть опущена, если ненужными. (Я включаю инициализатор, потому что calloc()
выполняет эквивалентную инициализацию выделенного пространства.) «Слишком большой» следует интерпретировать по отношению к массиву, выделяемому в стеке.
'own' должен быть' int ** '. –
Часто лучше всего моделировать массив 2d как непрерывный блок и использовать i x rows + j для доступа к элементам. Рассмотрите это как альтернативу. – Bathsheba
Чтобы быть более точным, это * не * 2D-массив, а только эмуляция такой вещи через указатели на указатели. Не делай этого, если не должен. 'int (* own) [n] = malloc (sizeof (int [m] [n]));' все, что вам нужно, с достойным компилятором C. –