字符串数组的部分副本

时间:2014-02-17 05:09:37

标签: c linux string copy

我可以这样做,将字符串数组内容从一个复制到另一个吗?

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];       
}

3 个答案:

答案 0 :(得分: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标准的一部分,但它实际上与mallocstrcpy完全相同。在这里阅读更多What does strdup do?

答案 1 :(得分:2)

你正在做的是复制指向文本行的指针,这样你最终会得到两个char *的数组,这些数组指向包含实际单词的相同物理内存。

问题在于,如果你通过“&#39;然后&#39; childWords&#39;会改变,因为他们指向相同的记忆。

最安全的方法是获取每个单词的字符串长度&#39;并分配新的记忆,复制字符串,以便“儿童词汇”指向不同的记忆。

答案 2 :(得分:1)

为什么不使用memcpy()bcopy()呢? 另外,我认为你不需要从malloc()投射结果。