2014-02-17 37 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?