#arrays #multidimensional-array
Вопрос:
Я новичок в C. Мне был приведен пример создания памяти из 2D-массива, который я всегда использовал. Пример выглядит следующим образом:
complex** calloc_com2d(int value1, int value2){
complex **c;
int i;
c = (complex**)calloc(value1, sizeof(complex*));
if(c==NULL){
perror("MemError.n");
exit(1);
}
for(i=0; i<value1; i ){
c[i] = (complex*)calloc(value2, sizeof(complex));
if(c[i]==NULL){
perror("MemError.n");
exit(1);
}
}
return c;
}
Другая версия создания памяти из 2d массива выглядит следующим образом:
complex **mat_new(int t,int r){
int i;
complex **tmp;
tmp = (complex**)calloc(t, sizeof(complex*));
for(i=0;i<t;i ){
tmp[i] = (complex*)calloc(r, sizeof(complex));
}
// MEM =2;
return tmp;
}
Вопрос в том, что я не знаю, что лучше использовать, и если я хочу создать память для 3d-массива, что мне делать? И что мне делать, если я хочу освободить память этого 3D-массива.
Я попытался записать память 3D-массива. Я не знаю, хорошо ли все пройдет. Я думаю, что это не так правильно.
complex*** calloc_com3d(int value1, int value2, int value3){
complex ***c;
int i, j;
c = (complex***)calloc(value1, sizeof(complex*));
if(c==NULL){
perror("MemError.n");
exit(1);
}
for(i=0; i<value1; i ){
c[i] = (complex**)calloc(value2, sizeof(complex*));
if(c[i]==NULL){
perror("MemError.n");
exit(1);
}
for ( j = 0; j < value2; j ) {
c[j] = (complex**)calloc(value3, sizeof(complex));
if(c[j]==NULL){
perror("MemError.n");
exit(1);
}
}
}
return c;
}
Большое вам спасибо за чтение. Я был бы очень признателен вам за помощь.
Комментарии:
1. Второй не проверяет, была ли выделена память. Это также зависит от того, должна ли память быть непрерывной или нет.
2. @DaveNewton Большое вам спасибо за ваш ответ. Я использую первый в своей программе. Все параметры в массиве имеют значение и указаны, так что, возможно, это означает, что они непрерывны? Извините, я не совсем уверен.
3. Они могут быть смежными, но поскольку память распределена несколькими блоками, нет никакой гарантии-память может быть где угодно. Это не обязательно плохо. Выделение другого измерения может быть выполнено точно таким же образом.
4. @DaveNewton Если я имитирую первый метод написания кода, смогу ли я получить память 3d-массива? Я постараюсь сделать все, что в моих силах.
5. @DaveNewton Я написал один и добавил в часть вопроса. Я не знаю, правильно ли это написано.