2012-02-07 23 views
2

我有以下代碼:堆和棧的問題,對於結構 - C編程

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

struct B 
{ 
    int _arr[5]; 
}; 
struct A 
{ 
    struct B *_pb_arr; 
}; 


int main() 
{ 
    int i,j; 
    struct B b; 
    struct B *pb = (struct B*)malloc(sizeof (struct B)); 
    *pb = b; 

    struct A a; 
    a._pb_arr = (struct B*)malloc(sizeof (struct B)*2); 
    a._pb_arr[0] = b; //first question 
    a._pb_arr[1] = *pb; //second question 

    for (i=0;i<2;++i) 
    { 
     for (j=0;j<5;++j) 
     { 
      a._pb_arr[i]._arr[j] = i; 
     } 
    } 
    struct A a2 = a; 

    for (i=0;i<2;++i) 
    { 
     for (j=0;j<5;++j) 
     { 
      printf ("%d, ", a2._pb_arr[i]._arr[j]); 
     } 
    } 
    return 0; 
} 

我的問題是:爲什麼:a._pb_arr[0] = b; 分配是堆棧。 和下一行:a._pb_arr[1] = *pb 該分配在堆上?

好像a.pb_arr被分配在堆上,每個任務也在堆上。

+0

這取決於您的意思是「分配在(堆棧|堆)」上。 (這不是標準術語。)第一項任務是將結構從堆棧複製到堆中,而第二項任務是將結構從堆的一部分複製到另一部分。 – ruakh 2012-02-07 18:20:38

+0

你的問題並不完全清楚,但你想知道爲什麼通過賦值將結構總是複製到堆中,即使最初在堆棧中定義了一個結構? – 2012-02-07 18:21:17

+0

所以我低估了你們兩個我認爲...在這兩種情況下,它被複制到堆權利? – 2012-02-07 18:22:55

回答

1

賦值不在堆棧或堆上,對象是。

對象a是在棧上,因爲它的創建是這樣的:

struct A a; 

要在堆上創建對象,必須爲他們使用malloc分配內存。

雖然a在棧上,a._pb_arr將堆在堆上。完成後,您必須明確free內存。遵循相同的推理,b在堆棧上,而pb在堆上。

當您分配數組a._pb_arr中的對象時,這些值將被複制,但由於您將內存分配給a._pb_arr,所以它們仍保留在堆上。

爲了防止內存泄漏,您必須使用free來同時處理a._pb_arrpb

+0

但是它不是這樣:a._pb_arr [0] = b,它進入分配給結構B的第一個位置,然後將b複製到結構B中? – 2012-02-07 18:20:59

+0

@fgfjhgrjrerjhm我知道答案有點含糊,所以我編輯了它。希望現在更清楚。 – 2012-02-07 18:25:04

+0

謝謝,但看看我寫給「rukah」,我認爲這對我的意思更清晰 – 2012-02-07 18:28:41