2013-03-25 28 views
6

Tôi có chức năng, ý tưởng cơ bản của hàm là thay đổi những gì a trỏ đến. Phiên bản đầu tiên hoạt động tuy nhiên phiên bản thứ hai thì không.Bất thường con trỏ C, vui lòng giải thích

Ai đó có thể giúp tôi hiểu điều gì đang xảy ra ở đây không?

// 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; 
} 

Tôi gọi hàm như vậy

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

    swap(&a); 

    return 0; 
} 

Ngoài ra, cả hai chức năng không thuộc về cùng một tập tin cùng một lúc.

+0

Bạn đang làm điều gì đó rất sai trong hàm thứ hai. – wRAR

+0

Tại sao đặt tên cho một biến mới có cùng tên của paramater? –

+0

re tuyên bố mảng int trong hàm hoán đổi thứ hai là một sự giám sát khi đăng ở đây. Tôi đã xóa nó khỏi câu hỏi. – robbmj

Trả lời

14

Mức độ ưu tiên của [] cao hơn * (trên thực tế, [] có mức ưu tiên cao nhất trong C). Điều đó có nghĩa là biểu thức của bạn là *(a[0]) thay vì (*a)[0] như bạn dự định.

+0

Tôi không chắc chắn '(* a) [0]' được dự định, vì '* a' không thể ghi được. – wRAR

+0

Cảm ơn Ben, điều đó đã làm cho các trick, cũng cảm ơn cho lời giải thích bao gồm. – robbmj

Các vấn đề liên quan