2017-04-05 37 views
0

我有一個分配給我的數據結構課上做,我在一點點麻煩。我有一些結構,即:麻煩與void *的鑄造INT/char和替換結果

typedef struct { 
    char *materie; 
    int ore_curs; 
    int ore_lab; 
    int credit; 
    int teme; 
} TMaterie; 

typedef struct { 
    char *nume; 
    float medie; 
    char grupa[6]; // 324CB + NULL 
    int varsta; 
} TStudent; 

typedef struct { 
    void *key; 
    void *value; 
    int frequency; 
} Pair; 

typedef struct celulag { 
    void *info; 
    struct celulag *urm; 
} TCelulaG, *TLG, **ALG; 

最後一個是一個通用的列表結構,它將在info中接受任何類型的結構。的事情是,我需要將其轉換成一對的結構,這樣它會指出一個鍵(這將是或者是字符或int)和值(這將是類型TMaterie或TStudent的)。我需要作出規定分配該相應的功能,我已經成功地做到這一點:

TLG aloca_string_materie(char *key, TMaterie value){ 
    TLG cel = (TLG) malloc(sizeof(TCelulaG)); 
    if(!cel) 
     return NULL; 
    cel->info = (Pair*)malloc(sizeof(Pair)); 
    if(!cel->info){ 
     free(cel); 
     return NULL; 
    } 
    cel->urm = NULL; 
    ((Pair*)cel->info)->value = (TMaterie*)malloc(sizeof(TMaterie)); 
    ((Pair*)cel->info)->key = (char*)malloc(50*sizeof(char)); 
    ((Pair*)cel->info)->frequency = 0; 
    ((Pair*)cel->info)->key = key; 
    ((TMaterie*)(Pair*)cel->info)->materie = value.materie; 
    ((TMaterie*)(Pair*)cel->info)->ore_curs = value.ore_curs; 
    ((TMaterie*)(Pair*)cel->info)->ore_lab = value.ore_lab; 
    ((TMaterie*)(Pair*)cel->info)->credit = value.credit; 
    ((TMaterie*)(Pair*)cel->info)->teme = value.teme; 
    return cel; 
} 

,我現在面臨的問題是,當我嘗試打印出來的關鍵,即

(((Pair*)cel->info)->key) 

它給我同樣的價值

((TMaterie*)(Pair*)cel->info)->materie 

我不知道爲什麼。

有人可以告訴我我做錯了什麼嗎?

+1

[請參閱爲什麼不投的malloc()'和家庭'C'的'返回值的討論。(HTTP ://stackoverflow.com/q/605845/2173917)。 –

+0

另外,我不得不說,應該有4個功能,他們每個人的分配是這樣的:1(鍵 - 字符串值 - TStudent),1(關鍵 - INT,價值 - TStudent)等。 –

+2

這就是爲什麼我討厭typedefing指針.....嘆息...... –

回答

2

你有兩個主要問題

((Pair*)cel->info)->value = (TMaterie*)malloc(sizeof(TMaterie)); 
[...] 
((TMaterie*)(Pair*)cel->info)->materie = value.materie; 

TMaterie成員爲Cel->infovalue,所以

((TMaterie*)(Pair*)cel->info)->materie 

必須

((TMaterie*)((Pair*)cel->info)->value)->materie 

而且使用

((Pair*)cel->info)->key = (char*)malloc(50*sizeof(char)); 
[...] 
((Pair*)cel->info)->key = key; 

您將要覆蓋ated關鍵內存malloc。 如果像我想,關鍵是一個字符串,只需使用strcpy

((Pair*)cel->info)->key = (char*)malloc(50*sizeof(char)); 
[...] 
strcpy(((Pair*)cel->info)->key, key); 
+0

@ElvisTeixeira是的,我upvoted你:) – LPs

+0

@LPs非常感謝你!我幾個小時一直纏着我的頭,現在我終於明白了。很好的解釋。再次感謝! –

2

的問題是要覆蓋指針值,而不是寫它指向的緩衝區。你是做如下:

((Pair*)cel->info)->key = malloc(...); 
    ((Pair*)cel->info)->key = key; 

在你ASIGN無論是在關鍵的參數傳遞的指針的第二行,所以你不使用你在上面分配的內存,它是被泄露。

你可能需要的是通過複製的關鍵參數所指向的內容,你可以使用strcpy功能。這樣做:

((Pair*)cel->info)->key = malloc(...); 
    strcpy(((Pair*)cel->info)->key, key);