所以我做了2个函数,将元素添加到2d数组中,然后释放它。数组是n x2。每次n = n + 1时,我都在使用realloc分配额外的空间。这是我的代码:
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错误地分配了表,即使它在尝试释放时崩溃了,而不是在分配时崩溃了。
任何想法都是有帮助的,在此先感谢:)
答案 0 :(得分:1)
重新分配给引用对象的大小乘以所需元素的数量。问题的一部分是坏名字的选择。 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数组。它是一个指针。 table as pointer to pointer to int。 int a[3][4]
是2D数组或array 3 of array 4 of int