2013-03-25 85 views
6

我有一個函數,函數的基本思想是改變什麼a指向。第一個版本可以工作,但第二個版本不能。C指針異常請詳細解釋

有人能幫我理解這裏發生了什麼嗎?

// this works 
void swap(int **a) { 
    int *temp = malloc(sizeof(int) * 3); 
    temp[0] = 0; 
    temp[1] = 1; 
    temp[2] = 2; 
    *a = temp; 
} 

// this does not 
void swap(int **a) { 
    *a = malloc(sizeof(int) * 3); 
    *a[0] = 0; 
    *a[1] = 1; // seg fault occurs on this line 
    *a[2] = 2; 
} 

我打電話,像這樣

int main() { 
    int b[] = {0,1}; 
    int *a = b; 

    swap(&a); 

    return 0; 
} 

而且,這兩種功能不同時屬於同一個文件的功能。

+0

你在第二個函數中做了非常錯誤的事情。 – wRAR 2013-03-25 18:52:27

+0

爲什麼用同名的參數命名一個新的變量? – 2013-03-25 18:56:01

+0

重新聲明第二個交換函數中的int數組是在這裏發佈時的疏忽。我已經從問題中刪除了它。 – robbmj 2013-03-25 19:04:35

回答

14

[]的優先級高於*(事實上,[]在C中的優先級最高)。這意味着您的表達是*(a[0])而不是您想要的(*a)[0]

+0

我不確定'(* a)[0]'是有意的,因爲'* a'不是可代換的。 – wRAR 2013-03-25 18:57:26

+0

感謝Ben,這個訣竅,也感謝你的包含解釋。 – robbmj 2013-03-25 19:03:07