1

这是我尝试过的代码,结果是分段错误..

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

1 回答 1

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

    并称其为int **universe = allocate(124);,或

  • 传入要分配内存的指针的地址,

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

    并称它为allocate(&universe, 123);.

注意:我已经删除了初始化循环,因为calloc已经将分配的内存归零,因此没有必要再次将其设置为 0。

于 2013-06-11T14:33:45.713 回答