我有以下程序在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);
}
答案 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;
ovi
是int*
的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;
但是,严肃地说,没有理由以你的方式玩指针。无论你想要完成什么:只需简单地处理更有趣的问题。编程和计算机科学过于充满难以解决模糊代码和指针/数组间接问题的困难和有趣的问题。