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然后才能安全地使用它们。否则,您将取消引用可能指向任何地方的指针,因此会出现段错误。

目前尚不清楚您要做什么,但是如果您要声明一个具有静态大小的二维数组int,请这样做:

int ovi[3][N];

whereN是您希望矩阵的列数的编译时间常数。这实际上分配了 3N 个整数的存储空间。

否则,您需要显式初始化所有指针,并且它们需要指向为实际整数分配的存储空间。

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 回答