2012-03-02 23 views
1

任務:複製char指針數組的正確方法?

我在 num_filtered_records記錄在filtered_records陣列,其中的過濾的記錄數。我想在binfo->filtered_recordsbinfo->num_filtered_records中複製這些信息,因爲filtered_records後來在我的代碼中是免費的。

定義:

char** filtered_records; 
size_t num_filtered_records; 

段:

binfo->filtered_records = malloc(num_filtered_records*sizeof(char*)); 

memcpy(binfo->filtered_records, 
     filtered_records, 
     num_filtered_records * sizeof(char*)); 

問題:

當我打印binfo->filtered_records,我看到所有的記錄,但某些記錄有 已被替換的值不正確。我不知道我錯過了什麼。

+0

是否要將指向filtered_records的指針複製到binfo-> filtered_records或實際數據中? – Gangadhar 2012-03-02 09:57:45

回答

4

你在做什麼不重複的實際數據,它只是複製指針。而不是memcpy的,做一個爲:

for (i = 0; i < num_filtered_records; i++) 
    binfo->filtered_records[i] = strdup(filtered_records[i]); 

如果沒有strdup,使用malloc(strlen(filtered_records[i]) + 1)然後strcpy

+0

好吧,我試過了,更新了這個問題。 – 2012-03-02 10:09:46

+0

@VaibhavBajpai初始字符串NUL終止?顯示更多細節,做一些調試。 – cnicutar 2012-03-02 10:11:43

+0

是的,我解決了這個問題,謝謝 – 2012-03-02 10:16:48

3

您正在複製指向每個值的指針數組,但是您並未複製實際值。因此,記錄本身發生的任何更改都將反映在原始的filtered_records和新的binfo->filtered_records中。

如果您在複製後爲filtered_records中的每條記錄釋放內存,則binfo->filtered_records中的所有條目現在指向無效內存。

cnicutar的答案告訴你如何安全地複製實際記錄。