добавление и освобождение 2d массива через функцию в c - PullRequest
1 голос
/ 07 марта 2019

Итак, я сделал 2 функции, чтобы добавить элементы в 2d массив и затем освободить его.Массив nx 2. Я использую realloc для выделения дополнительного пространства каждый раз, когда n = n + 1.Это мой код:

void add_cell(int** table, int value1,int value2,int elements_count){

    table=(int**)realloc(table, sizeof(*table) * (elements_count+1)); //<--I think this may be problematic
    table[elements_count]=(int*)malloc(2*sizeof(table[elements_count]));

    table[elements_count][0]=value1; 
    table[elements_count][1]=value2;
}

void reset_table(int** table,int elements_count){
    int i;
    for(i=0;i<elements_count;i++){
        free(table[i]);
    }
    printf("reset done");
}

, когда я добавляю дополнительные ячейки, я добавляю только 1 дополнительную строку каждый раз.таким образом, массив 2x2 становится 3x2, а 3x2 становится 4x2, поэтому, если я звоню так:

add_cell(coord_table,5,4,3);

before        after
1 2            1 2 
2 3     ->     2 3 
3 4            3 4 
               4 5 

Это то, как я вызываю функции (этот код имеет какую-то цель, его просто длятестирование функций):

int main(){
    int **coord_table;
    int i;
    for(i=0;i<5;i++){
        add_cell(coord_table,i+1,i+2,i);// should allocate 1extra row each time so 
                                        //when i=0 you should have [1 2] 
                                        //when i=2 [1 2][2 3] 
                                        //when i=3 [1 2][2 3][3 4] and so on...
    }

    reset_table(coord_table,5);

    for(i=0;i<5;i++){
        add_cell(coord_table,i+1,i+2,i);
    }

    reset_table(coord_table,5);
    free(coord_table);

   return 0;     
}

Я новичок в использовании 2d-массивов с malloc и realloc, я даже не знаю, насколько это хороший способ сделать то, что я хочу, но это то, что я придумал,Но он продолжает падать, когда пытается вызвать reset_table.Я полагаю, что неправильно распределяю таблицу с помощью realloc, даже если происходит сбой при попытке освобождения, а не при выделении.

Любая идея полезна, заранее спасибо :)

1 Ответ

1 голос
/ 07 марта 2019

Перераспределить под размер ссылочного объекта умноженное на количество необходимых элементов. Часть проблемы - выбор плохого имени. elements_count - это не количество элементов, а индекс последнего элемента.

Нет необходимости в приведениях.

Необходимо перераспределить table, иначе main() не увидит новое значение.

int** add_cell(int** table, int value1,int value2,int last_element_index){
    // table=(int**)realloc(table,sizeof(table)+sizeof(int**));
    table= realloc(table,sizeof *table) * (last_element_index + 1));
    // Better code would check for allocation success here.

    // table[elements_count]=(int*)malloc(2*sizeof(table[elements_count]));
    table[elements_count]=malloc(sizeof *table[elements_count] * 2);

    table[elements_count][0]=value1; 
    table[elements_count][1]=value2;
    return table;
}

Первоначальное распределение не требуется.

int main(void) {
  // int **coord_table=(int**)malloc(1*sizeof(int*));
  int **coord_table = NULL;

  int i;
  for(i=0;i<5;i++){
    coord_table = add_cell(coord_table,i+1,i+2,i);
  }

  reset_table(coord_table,5);

  for(i=0;i<5;i++){
    coord_table = add_cell(coord_table,i+1,i+2,i);
  }

  reset_table(coord_table,5);
  free(coord_table);

  return 0;     
}

Деталь

int** table не является двумерным массивом. Это указатель. таблица как указатель на указатель на int . int a[3][4] является примером двумерного массива или массива 3 массива 4 из int

...