C - 分段错误,同时解除引用3D阵列

时间:2013-10-25 18:51:40

标签: c

我有以下程序在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);
}

1 个答案:

答案 0 :(得分: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;

oviint*的3元素数组。您必须先初始化ovi的元素,然后才能安全使用它们。否则,您将取消引用可指向任何位置的指针,因此会出现段错误。

目前还不清楚你要做什么,但是如果你试图声明一个具有静态大小的int的二维数组,那么就这样做:

int ovi[3][N];

其中N是您希望矩阵的列数的编译时常量。这实际上分配了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;

但是,严肃地说,没有理由以你的方式玩指针。无论你想要完成什么:只需简单地处理更有趣的问题。编程和计算机科学过于充满难以解决模糊代码和指针/数组间接问题的困难和有趣的问题。