2015-04-30 6 views
-1

Для двухмерного массива, я в настоящее время с помощью следующего:Calloc двумерный массив

int * own; 

own = (int *)calloc(mem_size, sizeof(int)); 

for (i=0;i<mem_size;i++){ 
    own[i] = (int *)calloc(3, sizeof(int)); 
} 

Однако каждый раз, когда я ссылаться на собственном [я] [J], я получаю сообщение об ошибке говорящее что индексированное значение не является ни массивом, ни указателем, ни вектором.

+5

'own' должен быть' int ** '. –

+1

Часто лучше всего моделировать массив 2d как непрерывный блок и использовать i x rows + j для доступа к элементам. Рассмотрите это как альтернативу. – Bathsheba

+2

Чтобы быть более точным, это * не * 2D-массив, а только эмуляция такой вещи через указатели на указатели. Не делай этого, если не должен. 'int (* own) [n] = malloc (sizeof (int [m] [n]));' все, что вам нужно, с достойным компилятором C. –

ответ

4

Использование:

int ** own; // int**, not int* 
own = calloc(mem_size, sizeof(int*)); //int*, not int 
             // And remove the explicit cast. 
1

Поскольку собственный объявлен как имеющий тип int *

int * own; 

затем own[i] скалярная объект типа int и вы не можете применить к нему оператор индекс.

Вы могли бы написать следующим образом

int (*own)[3] = calloc(mem_size, 3 * sizeof(int)); 

Другой способ заключается в следующем

int **own = malloc(mem_size * sizeof(int *)); 

for (i = 0; i < mem_size; i++) own[i] = calloc(3, sizeof(int)); 
4

Однако каждый раз, когда я ссылаться на собственные [я] [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() выполняет эквивалентную инициализацию выделенного пространства.) «Слишком большой» следует интерпретировать по отношению к массиву, выделяемому в стеке.

+0

Стандартное предупреждение о том, что VLA выделяются в стеке, поэтому VLA может не быть хорошей идеей если 'mem_size' - большое число. – user3386109

+0

@ user3386109, спасибо, я обновил свой ответ, чтобы включить предупреждение о распределении стека для VLA. –

0

Неверный тип для 2-мерного массива - хорошо указана многими.

Разное Предлагаемое решение.

При распределении используйте переменную типа sizeof, а не sizeof. Менее вероятно, чтобы это произошло неправильно - проще в обслуживании.

//int * own; 
int **own; 

own = calloc(row_count, sizeof *own); 
for (i=0; i<row_count; i++){ 
    own[i] = calloc(column_count, sizeof *(own[i])); 
}