2014-02-17 80 views
0

我可以這樣做,將字符串數組內容從一個拷貝到另一個嗎?字符串數組的空間副本

char **words = (char **)malloc(sizeof(char*) * lines_allocated); 
char **childWords = (char **)malloc(sizeof(char*) * len1); 
int i; 
for(i = startIndex; i < endIndex; i++) { 
    childWords[i] = words[i];  
} 
+1

您正在複製指向字符串的指針,而不是字符串本身。 – ajay

回答

2

你在做什麼是複製指針文字的線條,讓你最終將與焦炭的兩個數組*的哪個點包含實際的話相同的物理內存。

這樣做的問題是,如果你通過「字」,然後「childWords」更改內存,因爲它們指向同一個存儲器會改變。

要做到這一點是讓每一個「字」的字符串長度和分配新的內存,複製串過讓「childWords」指向不同的內存最安全的方式。

+0

我是否需要爲每個「單詞」分配新內存,從頭開始分配「childWord」會不一樣? – Lisa

+0

您需要根據長度單詞[i]爲「childWord [i]」分配新內存。例如。 childWord [i] = new char [strlen(word [i])+ 1];這創建了一個與原始單詞[i]相同大小的新內存,而childWord [i]現在指向它。現在,您可以使用memcpy/strcpy /或任何您選擇的其他方法將原始單詞[i]複製到這個新的childWord [i]中。 – Chris

1

爲什麼不用memcpy()bcopy()代替? 此外,我不相信你需要從malloc()投下結果。

3

您正在複製指向字符串的指針,而不是字符串本身。您應該將for循環改變

for(i = startIndex; i < endIndex; i++) { 
    childWords[i] = strdup(words[i]); // creates a new copy of the string  
} 

strdup通過分配足夠的內存來複制傳遞給它的字符串,即複製的字符串,它返回一個指向一個新的字符串,是字符串的副本指向words[i]。指針可以傳遞給free。它在string.h頭文件中聲明。

請注意,你不應該投的malloc結果。如果忘記包含stdlib.h頭文件,則沒有任何好處,並且會導致錯誤。另外strdup是POSIX標準的一部分,並且在引擎蓋下,它有效地做了與malloc然後strcpy相同的事情。在這裏閱讀更多What does strdup do?