对于程序,我想使用malloc()通过命令行发送参数的数组副本。
例如,如果我做./a.out一两三 我想要一个带有{a.out,one,two,3}的数组。
但是,我在使程序运行时遇到了一些问题。这就是我所拥有的:
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;
}
正如您可能想象的那样,这不起作用。我提前道歉,如果这完全没有意义,因为我刚开始学习指针。此外,我不太确定如何编写代码以在我执行复制所需的操作后释放*数组中的每个元素。
有人能给我一些关于我应该做些什么的建议,让它做我想做的事吗?
感谢您的帮助!
答案 0 :(得分:3)
您没有分配或复制终止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];
}
}
答案 1 :(得分:2)
首先你需要分配一个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 \0
strcpy(array[index], *argv);
++argv;
}
array[index] = NULL; /* end of array so later you can do while (array[i++]!=NULL) {...} */
答案 2 :(得分:0)
使用
char *array;
您定义了char*
类型的对象。即:一个值可以指向char
的对象(以及下一个char
,...,...)
你需要
char **array;
使用这种新类型,array
的值指向char*
,即另一个指针。您可以在char*
中分配内存并保存已分配内存的地址,而不是char
。