我想将输入中的字符串分配到数组中。要创建动态内存分配,我需要输入中每个单词的字符长度。但是在这种情况下如何使用可变参数函数来执行此操作。
#include <stdarg.h>
#include <stdlib.h>
#include <stdio.h>
void foo(int size_of_input, ...) //From the input. For example foo(3, "Foo", "Bar", "Something")
{
int i;
va_list va_data;
char **input = malloc(values * sizeof(char*)) //This of course won't work. Is there a good alternative ? I don't wanna use a static array.
for (i = 0; i < size_of_input; i++)
{
input[i] = va_arg(va_data, char*); //The type of the input.
}
va_end(va_data);
/*
...
Continue with the array.
*/
free(input);
return;
}
答案 0 :(得分:2)
这应该有效:
void foo(int size_of_input, ...)
{
int i;
va_list va_data;
char **input = malloc(size_of_input * sizeof(char*));
if(input == NULL)
{
fprintf(stderr, "out of memory\n");
exit(1);
}
va_start(va_data, size_of_input);
for (i = 0; i < size_of_input; i++)
{
input[i] = strdup(va_arg(va_data, char*));
}
va_end(va_data);
/* ... Continue with the array. */
for (i = 0; i < size_of_input; i++)
{
free(input[i]);
}
free(input);
}
strdup
不是很标准,但大多数系统都有它,在<string.h>
中声明。如果你没有它,写起来很简单:
char *mystrdup(char *str)
{
char *ret = malloc(strlen(str) + 1); /* +1 for \0 */
if(ret == NULL)
{
fprintf(stderr, "out of memory\n");
exit(1);
}
strcpy(ret, str);
return ret;
}
请注意,在所有这些中,我们执行N + 1分配:N表示字符串,1表示指向它们的指针数组。因此,当我们完成时,我们必须执行N + 1个释放。也许你想要完成1个分配(和1个免费)。这是可行的,但更棘手。
附录:根据您在“继续使用数组”部分中所做的操作,您可能根本不需要重新分配字符串。对于函数foo()
的持续时间,在它返回之前,所有传递的字符串都保持有效,所以你实际上可以做到
input[i] = va_arg(va_data, char *);
就像你第一次写的一样。 (在这种情况下,当然,你最后不需要或想要我的for (i = 0; i < size_of_input; i++) free(input[i]);
循环。)