如何在C中复制char **?

时间:2015-04-24 01:04:55

标签: c arrays pointers

我无法理解C中指针的概念。我有一个指向字符串的指针数组,

char ** args;

我希望将args复制到另一个指向字符串的指针数组。

char ** args2;

我试过了,

args2 = args;

但是当我操纵args2时,我也操纵了args。我知道这是因为数组是指针。另外,如果我运行for循环,

// by the time I get to the for loop
// args holds {"string1", "string2", "string3"}
// args2 = NULL;
for(i = 0; args[i] != NULL; i++){
    args2[i] = args[i];
}

我收到了分段错误错误。

提前致谢。

2 个答案:

答案 0 :(得分:1)

您需要先为char*分配空间!即使你这样做,也不要忘记你仍然只是复制指向原始字符串的指针,所以如果修改args2中的字符串,原始字符串就是被修改的字符串

您可能需要以下内容:

args2

它们都为i = 0; while (args[i] != NULL) i++; args2 = malloc(i * sizeof *args2); for(j = 0; j < i; j++) { args2[i] = strdup(args[i]); } 中的指针分配内存,并且还复制了所有原始字符串。在第二个循环之前在arg2添加一个,并在第二个循环之后将i设置为args2[i],如果您希望像开始那样拥有NULL终止的数组。

答案 1 :(得分:0)

想象char**作为指针的指针。它的每个元素都是另一个指针,指向一个字符串(基本上你有一个字符串数组)。

假设您有char** args2。如果你这样做:

for(i = 0; args[i] != NULL; i++){
     args2[i] = args[i];
}

将每个指针的值从args复制到args2。与说法相同:

char *a = "abc";
char *b; // allocate memory
b = a;

或者,为了复制字符串,您需要复制其内容,而不仅仅是指向第一个元素的指针。所以,你需要使用strcpy之类的东西。请注意,为了使其正常工作,您还需要为args2分配内存,我在此省略。

for(i = 0; args[i] != NULL; i++){
    strcpy(args2[i], args[i]);
}

此外,您可能希望添加args的NULL终止符:

args2[i] = NULL;

为了分配内存,您需要知道args数组的大小。假设args有n个元素。然后,args2的内存分配可以如下完成(我还添加了复制部分):

// Allocate memory for n pointers to char
char **args2 = malloc(sizeof(char*) * n);
for(i = 0; args[i] != NULL; i++){
    // For each pointer of args 2, allocate memory to store the
    // correspondent string of args, including the NUL.
    args2 = malloc(strlen(args[i] + 1));
    strcpy(args2[i], args[i]);
}

您可能需要考虑在开头处使用静态字符矩阵来处理内存分配,以便于学习。