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;
}