0

Segmentation fault (core dumped)オンラインを提供する次のプログラムがあります*(x[0][0])=(int )&c[1][1];

int main() { 
    int (*ovi)[3]=  malloc(5*(sizeof *ovi));
    int  (**x)[3]=  malloc(5*(sizeof x));
    int    *** c =  malloc(4*(sizeof*c));

    *(c+0)=(int **)&(*(ovi+1));
    *(c+1)=(int **)&(*(ovi+2));

    *(*(ovi+0)+0)=0;
    *(*(ovi+0)+1)=1;

    *(*(ovi+1)+0)=10;
    *(*(ovi+1)+1)=11;

    *(*(ovi+2)+0)=20;
    *(*(ovi+2)+1)=21;

    int *y[3][5] ;
    y[0][0]=(int *)&c[1][1];
    printf("%i\n",*(y[0][0]));

    *(x[0][0])=(int )&c[1][1];

    printf("%i\n",(*(x[0][0]))); //output should be 21

    free(ovi);
    free(c);
    return(0);
}
4

1 に答える 1

1

このコードには多くの問題があります。セグメンテーション違反が発生する可能性がある (そして発生する可能性が高い) 最初のポイントは次のとおりです。

*(*(ovi+0)+0)=0;
*(*(ovi+0)+1)=1;

*(*(ovi+1)+0)=10;
*(*(ovi+1)+1)=11;

*(*(ovi+2)+0)=20;
*(*(ovi+2)+1)=21;

oviの 3 要素配列ですint*ovi安全に使用する前に、 の要素を初期化する必要があります。そうしないと、どこかを指す可能性のあるポインターを逆参照しているため、segfault が発生します。

何をしようとしているのかは明確ではありませんintが、静的サイズを持つ の 2 次元配列を宣言しようとしている場合は、次のようにします。

int ovi[3][N];

whereNは、マトリックスに必要な列数のコンパイル時の定数です。これにより、実際には 3N int のストレージが割り当てられます。

それ以外の場合は、すべてのポインターを明示的に初期化する必要があり、実際の整数に割り当てられたストレージを指す必要があります。

int actual_integers[6];  /* you seem to have six elements of ovi */
ovi[0] = actual_integers + 0;
ovi[1] = actual_integers + 2;
ovi[3] = actual_integers + 4;

しかし、真面目な話、あなたのようにポインターをいじる理由はありません。何を達成しようとしていても、それを単純に実行し、より興味深い問題に取り組みます。プログラミングとコンピューター サイエンスは、あいまいなコードとポインター/配列の間接参照に焦点を当てるには、困難で興味深い問題でいっぱいです。

于 2013-10-25T19:15:50.053 に答える