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 に答える