我无法理解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];
}
我收到了分段错误错误。
提前致谢。
答案 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]);
}
您可能需要考虑在开头处使用静态字符矩阵来处理内存分配,以便于学习。