2009-07-15 73 views
3

我使用一個結構是這樣的:結構初始化問題?

define struct _Fragment{ 
    int a; 
    char *seq; 
}Fragment; 

我想初始化結構,並使用的malloc()方法中返回這樣

Fragment *frag=malloc(10*sizeof(Fragment)); 

動態存儲器中。然後我會使用片段指針是這樣的:

frag->seq="01001"; 

然後,當我返回大量碎片時就會出現問題。錯誤消息說(使用valgrind工具):

Uninitialised value was created by a heap allocation 

誰可以告訴我如何處理它。謝謝!

+1

我認爲你的意思是「typedef struct ...」而不是「define struct ...」 – mhawke 2009-07-15 02:13:17

回答

6

我不知道你在這裏有一個真正的問題,但對於適當的禮儀,你的配置是:

Fragment *frag=malloc(10*sizeof(Fragment)); 
if (frag) memset(frag,0,10*sizeof(Fragment)); 
+12

使用calloc()更容易() – Juliano 2009-07-15 02:14:36

4

的問題是,即使你使用malloc爲片段結構分配內存,您尚未初始化任何值。 malloc返回的內存,但不保證任何特定的值,所以你必須明確地初始化結構成員

Fragment* frag = malloc(10*sizeof(Fragment)); 
int i = 0; 
for (i = 0; i < 10; i++) { 
    frag[i].a = 0; 
    frag[i].seq = NULL; 
} 

如果你想保本初始化的內存,你應該使用釋放calloc。它具有增加內存消耗的額外成本,但對您的應用程序而言可能並不重要。

您也應該檢查的malloc居然成功了:)

0

你的代碼看起來合理,但在下面的行;

Fragment *frag=malloc(10*sizeof(Fragment)); 

您確定需要10*嗎?

如果您需要分配10個片段,那麼你應該承擔責任,初始化所有10

+0

不,我想要的數字是動態的。 – 2009-07-15 02:17:43

+0

好吧,如果你需要10,你需要初始化10!在你的代碼中,你只初始化了第一個片段的一個字段。 – 2009-07-15 02:47:55

2

的問題malloc不初始化任何它分配的內存。 Valgrind特別注意跟蹤尚未初始化的任何內存區域。

儘管您應該注意錯誤,但Valgrind(假設一切正常)應該打印該錯誤是因爲您試圖在某處使用未初始化的數據,這可能是無意的。但是,單位變量的使用不在您問題中的代碼中。