【发布时间】:2015-01-04 22:14:07
【问题描述】:
我想在与 main 不同的函数中重新分配 2D 矩阵,但不幸的是,我得到了一个无效的指针错误。我已阅读其他答案,但看不到我的错误在哪里。我的代码是:
void example(double* w, size_t s){
w=realloc(w,(s+1)*sizeof(double));
w[s]=3;
}
int main(int argc, char *argv[]){
double w[100][1];
int i;
for(i=0;i<100;i++){
example(w[i],sizeof(w[i])/sizeof(w[i][0])
}
free(w);
return 1;
}
所以数组的第一层总是固定的,但第二层可以改变。这有什么问题?
更正:
int main(int argc, char *argv[]){
double **w;
int i;
w=malloc(100*sizeof(double *));
for(i=0;i<100;i++){
w[i]=malloc(1*sizeof(double));
example(w[i],sizeof(w[i])/sizeof(w[i][0])
}
free(w);
return 1;
}
【问题讨论】:
-
w是example中的一个局部变量。对它的所有更改都是函数本地的。 -
sizeof(w[i][0] 在运行时将不知道更好地使用 example(&w[i], 'desired number of doubles to alloc' );
-
每个 malloc() 或 realloc() 都需要检查返回码以确保操作成功。
-
w 数组,一旦分配,需要将所有条目设置为 NULL。所以(在 main() 结束时)所有内存分配都可以传递给 free(),首先是辅助指针 (w[x]),然后是指向 w 的指针
-
这一行:free(w);必须在所有子内存分配通过 for( i=0;i