2016-12-05 56 views
0

我想知道爲什麼我的結構值在函數返回後丟失。函數調用值後的C返回結構指針值丟失

struct A { 
    int val1; 
    int val2; 
} 

main() { 
    struct A *a; 
    a->val1 = 1; 
    a->val2 = 2; 
    calc((void*)a); 
    // calc returns and a's values are 1 and 2 respectively 
} 

void calc(void* v) { 
    struct A *a = (struct A*) v; 
    ... 
    a->val1 = 2; 
    a->val2 = 3; 
} 
+4

在'main':'結構A * A; a-> val1 = 1;'你認爲'a'指向哪裏?除非指向有效內存,否則指針不得解除引用。 – kaylum

+0

'a'應該是堆棧中的地址(如果我錯了,請糾正我)。我試圖將malloc空間用於'a',但仍得到相同的結果。 – Celeste

+1

爲什麼你定義'main()'返回一個'struct A'?你錯過了一個關鍵的分號! –

回答

1

當你想處理指針時,你必須引入動態內存分配。創建一個指針意味着你告訴編譯器'我將存儲變量的地址'。因此,在這種情況下,您可以爲其創建對象分配地址或動態地爲其分配內存。

情況1:

main() { 
    struct A *a; 
    struct A obj;//assign address of other object manually 
    a = &obj; 
    a->val1 = 1; 
    a->val2 = 2; 
    calc((void*)a); 
    // calc returns and a's values are 1 and 2 respectively 
} 

情況2:

main() { 
    struct A *a; 
    a = (A *) malloc(sizeof(A));//dynamic memory allocation 
    a->val1 = 1; 
    a->val2 = 2; 
    calc((void*)a); 
    // calc returns and a's values are 1 and 2 respectively 
} 
+0

我對自己的地址和指針感到困惑。它現在工作:) – Celeste