0

セグメンテーション違反があり、どこに間違いがあるのか​​知りたいのですが。

説明させてください。

私のメインでは、3D配列を宣言します。int*** Matricegroupegeneralisant

次に、このメインは関数を使用します。recuperationinfoFich(&matricegroupegeneralisant); この関数は次のように宣言されます。recuperationinfoFich(int* * * * matricegroupegeneralisant)

この関数recuperationinfoFichは別の関数を使用しますrecuperationmatricegroupesgeneralisants(matricegroupegeneralisantA[Ni]); この関数は次のように宣言されていますrecuperationmatricegroupesgeneralisants( int*** matricegroupegeneralisant)

私のコード:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void allocationdynamiquetableautroisdimdentier(int**** Matrice,int nbniveau, int nbligne, int nbcolonne)
{
int i,j;
    *Matrice=(int***) malloc (sizeof(int**)*nbniveau);
    for (i=0; i<nbniveau; i++)
    {
        (*(Matrice))[i]=(int**) malloc (sizeof(int*)*nbligne);  // allocation dynamique de la matrice Matrice
        for (j=0; j<nbligne; j++)
        {
            ((*(Matrice))[i])[j]=(int*) malloc (sizeof(int)*nbcolonne);
        } 
    }
}


void recuperationmatricegroupesgeneralisants(int*** matricegroupegeneralisantA)
{
    (*matricegroupegeneralisantA)[0][1]=1;
}

void recuperationinfoFich(int**** matricegroupegeneralisantA)
{
    allocationdynamiquetableautroisdimdentier(matricegroupegeneralisantA,3, 3, 7);
    recuperationmatricegroupesgeneralisants(matricegroupegeneralisantA[1]);
}



void main(int args, char **argv)
{

    int*** matricegroupegeneralisantA;

    recuperationinfoFich(&matricegroupegeneralisantA);
}

Gdbを使用する場合:

(gdb) r
Starting program: /home/larimsna1/Desktop/a.out 

Breakpoint 1, 0x000000000040061a in main ()
(gdb) n
Single stepping until exit from function main,
which has no line number information.

Program received signal SIGSEGV, Segmentation fault.
0x00000000004005c8 in recuperationmatricegroupesgeneralisants ()
(gdb) 
4

1 に答える 1

1

問題はあなたの割り当て機能に関係しているのではないかと思います。そうは言っても、提供したコードには多くの機能的および文体的な問題があります。ある場所では、ポインターの逆参照に何度も失敗したため、ポインター型に整数を割り当てることになりました。引数を渡して戻り値を使用できない場合は、ほとんどのトランザクションで不必要にポインタを使用します。

このコードは、必要なことを実行し、正しく機能し、読みやすくする必要があります。

// allocation, returns pointer to allocated value
int *** allocationdynamique(int nbniveau, int nbligne, int nbcolonne)
{
    int *** Matrice;
    int i, j;
    Matrice = (int ***) malloc (sizeof(*Matrice) * nbniveau);
    for (i = 0; i < nbniveau; ++i)
    {
        Matrice[i] = (int **) malloc (sizeof(**Matrice) * nbligne);
        for (j = 0; j < nbligne; ++j)
        {
            Matrice[i][j] = (int *) malloc (sizeof(***Matrice) * nbcolonne);
        } 
    }
    return Matrice;
}

// computation, takes 2D array, modifies in place
void recuperationmatrice(int** matrice)
{
    matrice[0][1] = 1;
}

// you shouldn't use void main, its not part of the standard
int main(int args, char **argv)
{
    int*** matrice = allocationdynamique(3, 3, 7);
    recuperationmatrice(matrice[1]);

    return 0; 
}

また、文体の観点から、変数名は途方もなく長いので、演算子の前後にスペースを使用する必要があります。

このコードの間違いの多くは、コンパイラーが検出して警告できる間違いです。これらは正しくコンパイルされる有効なCコードですが、この場合や他のほとんどの場合は誤って記述されており、意図したとおりに機能しません。起こりうる事故を取り除くために、コンパイラの警告とともにコンパイルする必要があります。

gcc -Wall -c file.c -o file.o
于 2012-07-30T18:42:17.710 に答える