2013-08-03 18 views
0

所以在我的程序中,我試圖編輯原始數組「frags」的元素,最初,這些元素已經分配了存儲在某些槽中的字符串。但我不確定如何。在程序過程中,我需要重新分配原始數組中的元素,以便它們可以存儲更長的字符串,但是我的方法似乎導致了valgrind +函數錯誤。 Valgrind說錯誤來自realloc,而功能錯誤是輸出不正確。原始數組,Valgrind和功能錯誤的編輯元素

int main(void) { 
    char *frag[3]; 
    char *frag1 = malloc(4), *frag2 = malloc(5); 
    strcpy(frag1, "him"); 
    strcpy(frag2, "hers"); 
    frag[0] = frag1; 
    frag[1] = frag2; 
    char *k = frag[0]; 
    char *l = frag[1]; 
    k = realloc(k, 500); 
    strcat(k, l); 
    printf("%s\n ", frag[0]); 
    printf("%s\n ", frag[1]); 
    free(k); 
    free(l); 
    return 0; 
} 

我不是100%清楚malloc和realloc如何將它們分配給不同的變量。如果你這樣做

char *k = malloc(5); 
char *l = k; 
l = realloc(l, 100); 

你是否重新分配仍然指向k的內存?釋放和重新分配指針「l」的變化是否會影響指針「k」的內容?對不起,我是新來的C.

+0

從'k = realloc(k,500)'重新分配後,這可能會返回與原始'k'不同的指針值。但'k' *的原始值來自'frag [0]',它保持不變。一旦你這樣做了,指針* value *不再有效,因此使用它作爲取消引用(stmt'printf(「%s \ n」,frag [0]'這樣做)是未定義的行爲。處於類似的狀態,仔細查看原因,所以是的,假設'l'返回一個非NULL值,你的最後一個樣本'k'不再有效,這是btw,而不是recall方法()'。 – WhozCraig

回答

0
Are you reallocating the memory which is still pointed to, by k? Will changes in freeing and rellocating pointer "l" affect content of pointer "k"? Sorry, I am new to C. 

char *k = malloc(5); 
char *l = k; 
l = realloc(l, 100); 

ķ後也許仍然L點,也許不是。如果k沒有指向l,那麼l已經被realloc釋放了。

當您使用realloc。它會嘗試獲得內存基礎上的舊內存地址,如果成功,K仍然指向L.While,如果沒有足夠的內存.realloc將獲得一個新的內存,whoes地址是完全不同的舊的,並將數據從舊的內存複製到新的。然後它將釋放舊的內存