2013-07-31 39 views
-1

我有數據結構訪問點內的工會內部結構 - Visual C

struct a_str { 
    union { 
     struct { 
      struct c_str *c; 
     } b_str;   

     struct { 
      int i; 
     } c_str; 
    }; 

} 

struct c_str { 
    struct d_str; 
} 

struct d_str { 
    int num; 
} 

我試圖在結構d_str訪問NUM以下。出於某種原因,我不斷收到分段錯誤。

struct a_str *a = init_a(); //assume memory allocation and init is ok. 
a->b_str.c->d_str.num = 2; 

出了什麼問題?

+3

'//假設內存分配和初始化是好的如果你遇到段錯誤,我會認爲情況並非如此。 – Nbr44

+1

你能否向我們展示'init_a()'。 – mohit

+0

推斷是,如果你知道問題出在什麼地方,那麼你的指針不會被初始化 – Andrew

回答

0
struct a_str *a = init_a(); 

我的猜測:您init_a功能

  • 被分配a_str指針
  • 沒有分配A-> b_str.c指針

由於A-> b_str。 c沒有分配,當你想訪問它時,發生段錯誤

編輯:

第二猜測:你init_a功能

  • 被分配a_str指針
  • 被分配A-> b_str.c指針
  • 正在初始化A-> c_str.i整數值

通過初始化c_str.i值,它擦除了b_str.c值因爲它共享相同的位置(它是一個聯合)。

0

你需要檢查你的指針「C」,如果它已經被初始化

1

也許你是不是在你的init()功能a->b_str.c分配內存,這可能是原因,a->b_str.c指向垃圾的位置和分割故障由於訪問未分配的內存 - 非法內存操作。
如果init()函數是正確的,應該沒有任何問題(語法上你的代碼是正確的)。

下面我建議inti()功能,將爲您的嵌套結構正確分配內存(閱讀評論)。

struct a_str *init() 
{ 
    struct a_str *ret = malloc(sizeof(struct a_str)); // memory for `struct a_str` 
    struct c_str *cptr = malloc(sizeof(struct c_str)); // memory for inner struct 
    ret->b_str.c = cptr; //assigning valid memory address to ret->b_str.c 
    return ret; 
} 

下面是main()代碼具有用於解除分配/免費()動態分配的存儲器的步驟。

int main(int argv, char **argc) 
{ 
    struct a_str *ret = init();  
    ret->b_str.c->d.num = 5; 
    printf("%d\n", ret->b_str.c->d.num); 


    //Make sure to free the memory allocated through malloc 
    free(ret->b_str.c); // 1 first free in struct 
    free(ret);   // in reverse order of allocation 
    return 0; 
} 
+0

是正確的,所以添加一個free()代碼也是可以的,因爲OP在代碼中可能會有內存泄漏。 –

+0

@GrijeshChauhan更新時間感謝您指出。 – mohit