2013-10-25 28 views
0

我有以下計劃,讓我上線Segmentation fault (core dumped)*(x[0][0])=(int)&c[1][1];Ç - 分割故障而取消引用3D陣列

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); 
} 
+3

這是很多星號。我認爲你可以讓這個更具可讀性。 – crashmstr

+1

這使得Brainf ** k似乎幾乎可讀。 – Kninnug

+2

我想你在這裏需要更多的間接程度。 – WhozCraig

回答

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具有靜態大小的2 d陣,然後再去做這樣:

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; 

但是,嚴重的是,沒有任何理由像你一樣玩指針。無論你想完成什麼:簡單地做,並且處理更有趣的問題。編程和計算機科學充滿了難以集中於難以理解的代碼和指針/數組間接指向的問題。