对于一个程序,我想使用malloc()对命令行发送的参数进行数组复制。
例如,如果我做/a。一二三我想要一个包含{a的数组。出,一,二,三}进去。
然而,我有一些问题让我的程序工作。我有:
static char** duplicateArgv(int argc, char **argv)
{
char *array;
int j = 0;
// First allocate overall array with each element of char*
array = malloc(sizeof(char*) * argc);
int i;
// For each element allocate the amount of space for the number of chars in each argument
for(i = 1; i < (argc + 1); i++){
array[i] = malloc(strlen(*(argv + i)) * sizeof(char));
int j;
// Cycle through all the chars and copy them in one by one
for(j = 0; j < strlen(*(argv + i)); j++){
array[i][j] = *(argv + i)[j];
}
}
return array;
}
就像你想象的那样,这行不通。如果这在某种程度上完全没有意义,我提前道歉,因为我刚刚开始学习指针。此外,我不太确定如何编写代码来释放*数组中的每个元素后,我做了我需要的复制。
有没有人能给我一些建议,告诉我应该研究什么才能使它像我想要的那样?谢谢你的帮助!
您没有分配或复制终止NULL字符:
这一行需要修改为NULL
array[i] = malloc((strlen(*(argv + i)) + 1) * sizeof(char));
循环应该改成这样:
for(j = 0; j <= strlen(*(argv + i)); j++){
同样,如果您保存strlen()
调用的结果,代码可以得到更好的优化,因为您在很多地方调用它。
试试这样的循环:
// For each element allocate the amount of space for the number of chars in each argument
for(i = 0; i < argc; i++){
int length = strlen(argv[i]);
array[i] = malloc((length + 1) * sizeof(char));
int j;
// Cycle through all the chars and copy them in one by one
for(j = 0; j <= length; j++){
array[i][j] = argv[i][j];
}
}
首先你需要分配一个char*的向量,而不仅仅是一个char*
char **array;
array = malloc(sizeof(char*)*(argc+1)); // plus one extra which will mark the end of the array
现在你有一个array[0..argc]
/char*
指针
那么对于每个参数,你需要为字符串
分配空间int index;
for (index = 0; index < argc; ++index)
{
arrray[index] = malloc( strlen(*argv)+1 ); // add one for the
strcpy(array[index], *argv);
++argv;
}
array[index] = NULL; /* end of array so later you can do while (array[i++]!=NULL) {...} */
With
char *array;
定义了一个char*
类型的对象。也就是说:一个对象的值可以指向一个char
(和下一个char
,…),…)
char **array;
对于这个新类型,array
的值指向char*
,即另一个指针。您可以在char*
中分配内存并保存该分配内存的地址,但char
不能这样做。