Однако каждый раз, когда я ссылаюсь на own[i][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()
выполняет эквивалентную инициализацию выделенного пространства.) «Слишком большой» следует интерпретировать по отношению к массиву, выделенному в стеке.
person
John Bollinger
schedule
30.04.2015
own
должно бытьint**
. - person Daniel Kamil Kozar   schedule 30.04.2015int (*own)[n] = malloc(sizeof(int[m][n]));
— это все, что вам нужно для приличного компилятора C. - person Jens Gustedt   schedule 01.05.2015