通过C中的函数添加并释放2D数组



,因此我制作了2个功能,将元素添加到2D数组,然后释放它。阵列为nx2。我每次使用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;     
}

我有点新手使用Malloc和Realloc使用2D阵列,我什至不知道这是做我想做的事的好方法,但这是我想到的。但是,当它试图调用reset_table时,它会不断崩溃。我相信我正在用Realloc错误地分配表格,即使它在尝试自由时就会崩溃,而不是分配时。

任何想法都是有帮助的,请提前:)

重新分配到引用对象的大小所需元素的数量。问题的一部分是坏名称的选择。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不是2D数组。这是一个指针。表作为指向INT指针的指针。int a[3][4]是Int

的数组4的2D数组或数组3的示例

相关内容

  • 没有找到相关文章

最新更新