2016-12-05 49 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