2016-06-08 88 views
-2

我正在玩弄指針和結構。這是我一直在搞的程序。我得到一個segfault錯誤,我不知道爲什麼。我已經查看了一段時間,但似乎無法查明問題。有人可以向我解釋嗎?編輯:在createArray我在* purp [i] [j] ='1'得到段錯誤;段錯誤:結構,指針,二維數組

#include <stdio.h> 
#include <stdlib.h> 

struct purple_struct{ 
    int x; 
    int y; 
    char **purp; 
}; 

void print(int x, int y){ 
    printf("%d %d\n", x, y); 

    return; 
} 

void createArray(char*** purp, int x, int y){ 
    int i, j; 

    for (i = 0; i < x; ++i){ 
     for (j = 0; j < y; ++j){ 
      *purp[i][j] = '1'; 
     } 
    } 

    return; 
} 

int main(){ 
    int i, j; 

    struct purple_struct dog; 

    dog.x = 3; 
    dog.y = 4; 

    dog.purp = (char **)malloc(dog.x * sizeof(char *)); 
    for (i = 0; i < dog.x; ++i){ 
     dog.purp[i] = (char *)malloc(dog.y * sizeof(char)); 
    } 

    createArray(&dog.purp, dog.x, dog.y); 

    for (i = 0; i < dog.x; ++i){ 
     for (j = 0; j < dog.y; ++j){ 
      printf("%c", dog.purp[i][j]); 
     } 
    } 

    print(dog.x, dog.y); 

    return 0; 
} 
+2

完美的時間開始像gdb一樣的調試器 –

+2

提示:不傾向於成爲一個三星級程序員。 –

+1

甚至沒有這個必要。在普通的調試器上,像Eclipse一樣,一行一行地顯示錯誤的位置。 –

回答

2

您需要了解的operator precedence概念。就像在數學中一樣,像1 + 2×3這樣的表達意味着1 +(2×3)而不是(1 + 2)×3,編程語言對錶達式中不同運算符的執行順序具有規則。

對C的規則在這裏:http://en.cppreference.com/w/c/language/operator_precedence

在你的情況下,問題是,* purp [i] [j]實際上意味着*(purp [i] [j]),而不是(* purp )[i] [j]就像你期待的那樣。

0
void createArray(char*** purp, int x, int y){ 
*purp[i][j] = '1'; 

我認爲他們應該

void createArray(char** purp, int x, int y){ 
purp[i][j] = '1'; 

而且在主

createArray(&dog.purp, dog.x, dog.y); 

'&' 這裏沒有必要的,因爲你已經傳遞了一個指針。 '&'通常用於傳遞變量的地址。 糾正這幾件事情,它編譯得很好,不知道你想做什麼。