2015-10-04 103 views
-2

我不能完全弄清楚如何做到這一點,我試過這個和幾個變化,有些將編譯和看似工作正常,但我會得到非常隨機的段錯誤,它有一些事情要做與我聲明這些結構的方式。結構中的所有信息都是動態的。請讓我知道這樣做的正確方法,謝謝。結構中的動態結構

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


typedef struct 
{ 
    char* s2string1; 
    char* s2string2; 
    int s2int1; 
} struct2; 


typedef struct 
{ 
    char* s1string1; 
    char* s1string2; 
    struct struct2* mystruct; 
    int  int1;  
} struct1; 


struct struct2* RetS2(char* CopyMe) 
{ 
    int* Array = (int*) malloc (sizeof (int) * 5); 
    Array[0] = strlen (CopyMe); 

    struct struct2* S2 = (struct struct2*) malloc (sizeof (struct2)); 

    S2->s2int1 = Array[0]; 

    return S2; 

} 


struct struct1* RetS1() 
{ 
    struct struct1* S1 = (struct struct1*) malloc (sizeof (struct1)); 

    struct struct2* S2 = RetS2(); 

    S1->mystruct = S2; 

    S1->int1 = S2->S2int1; 


    return S1; 
} 

int main() 
{ 

    struct struct1 Top = RetS1(); 

    if (Top->mystruct->s2int1 == 10) 
     // do something 

    return 0; 
} 
+0

在結構中不能有「動態」結構。你可以擁有什麼(和你使用什麼)是指向另一個結構中的結構的指針。但是這與任何其他指向結構的指針都沒有什麼不同。 – Olaf

+1

不要將'malloc'和朋友的結果放在C中!並啓用警告並注意他們! – Olaf

+1

你總是把你不再需要的東西放在地上嗎? – EOF

回答

1

你的代碼有多種問題:

  1. 這是主要的問題

    RetS2的函數定義是

    struct struct2* RetS2(char* CopyMe) 
    

    這意味着它預計作爲杉木的一個char*第一個參數。但是當你這樣稱呼它時:

    struct struct2* S2 = RetS2(); 
    

    你不傳遞參數。這會調用未定義的行爲

  2. 這裏:

    int* Array = (int*) malloc (sizeof (int) * 5); 
    

    您分配了5個int內存。您使用數組的第一個元素並停止使用它。您還忘記freeArray分配的內存。

  3. malloc(家庭)演員is not required在C.
  4. 你不freemalloc版內存S2S1
+0

感謝很酷的傢伙,但是我修復了一切,但仍然崩潰。如果我正確地聲明結構的內存,有人可以給我一個簡單的是/否答案嗎?這就是我要問的。 – soqu49

+0

你仍然崩潰?你是什​​麼把struct struct2 * S2 = RetS2();改成?內存分配是正確的。但請參閱我的答案中的問題#2。此外,你應該檢查'malloc'的結果,看看它是否成功,並且應該釋放分配的內存(請參閱問題#4) –

+0

是的我知道關於free,但釋放內存不是問題。無論如何感謝它一定是別的。 – soqu49