Pointers 如何为指针分配一个大小未知的二维正方形数组?下面的函数有什么错误?
这是我试过的代码,结果是分段错误Pointers 如何为指针分配一个大小未知的二维正方形数组?下面的函数有什么错误?,pointers,multidimensional-array,dynamic-memory-allocation,calloc,double-pointer,Pointers,Multidimensional Array,Dynamic Memory Allocation,Calloc,Double Pointer,这是我试过的代码,结果是分段错误 void allocate(int ** universe,int n) // to assign pointer "a" a nXn matrix { universe=(int **) calloc(n,sizeof(int *)); int l; for(l=0;l<n;l++) universe[l]=(int *)calloc(n,sizeof(int)); int u; for
void allocate(int ** universe,int n) // to assign pointer "a" a nXn matrix
{
universe=(int **) calloc(n,sizeof(int *));
int l;
for(l=0;l<n;l++)
universe[l]=(int *)calloc(n,sizeof(int));
int u;
for(l=0;l<n;l++)
for(u=0;u<n;u++) //making all entries 00
universe[l][u]=0;
}
下面的函数有什么问题
由于参数是按值传递的,因此函数处理传入指针的副本,并且不修改调用方中的指针,该指针保持未初始化状态或仍然指向它以前指向的位置,并且您无法从调用方访问分配的内存,并尝试通过universe[i][j]访问它可能会导致分段错误。进一步的结果是,当allocate返回时,您丢失了指向已分配内存的唯一指针,这就是泄漏
正确的方法是
返回指针
int ** allocate(int n)
{
int **universe = calloc(n,sizeof(int *));
if (!universe) {
fputs(stderr, "Allocation of universe failed.");
exit(EXIT_FAILURE);
}
int l;
for(l = 0; l < n; l++) {
universe[l] = calloc(n,sizeof(int));
if (!universe[l]) {
fprintf(stderr, "Failed to allocate row %d.\n", l);
exit(EXIT_FAILURE);
}
}
return universe;
}
并将其称为分配&universe,123
注意:我已经删除了初始化循环,因为calloc已经将分配的内存归零,因此没有必要再将其设置为0。:谢谢。它起作用了。但在指针的情况下,实际参数和形式参数不是与您提到的复制相同的吗?例如,交换调用I.e&a,&b起作用,而不是a,b调用。对于上述分配函数,如果我必须使用不同的值连续调用该函数,我是否需要某种释放例程?如果是,我是否需要释放宇宙中的每一个[I]是吗?最后,释放可以通过函数完成吗?虽然我猜不是通过你的解释:复制创建?@Parikshit所有参数都是按值传递的。因此,如果传递一个指针,则传递该指针的副本。当然,它指向相同的地址,因此可以修改指向内存的指针,但不能修改调用者中指针指向的位置。因此,如果要为指针分配内存,必须返回指向分配内存的指针,或者在C++中传递指针的地址,可以通过引用传递参数,即空格ALLATATINT INT**和SUN,INTN。每个malloc都需要一个对应的free,所以在释放宇宙之前需要释放宇宙[i]。像void freeint**&universe,int n这样的调用会释放整个宇宙吗?
void allocate(int *** universe_addr,int n) // to assign pointer "a" a nXn matrix
{
int ** universe = calloc(n,sizeof(int *));
if (!universe) {
/* repair or exit */
}
int l;
for(l = 0; l < n; l++) {
universe[l]=(int *)calloc(n,sizeof(int));
if (!universe[l]) {
/* repair or exit */
}
}
/* Now set the pointer in the caller */
*universe_addr = universe;
}