动态数组的可变参数函数?
variadic-functions to a dynamic array?
我想将输入的字符串分配到一个数组中。要创建动态内存分配,我需要输入中每个单词的字符长度。但是在这种情况下,我该如何使用可变参数函数来做到这一点。
#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;
}
这应该有效:
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 [=11=] */
if(ret == NULL)
{
fprintf(stderr, "out of memory\n");
exit(1);
}
strcpy(ret, str);
return ret;
}
请注意,在所有这些操作中,我们执行了 N+1 次分配:N 次用于字符串,1 次用于指向它们的指针数组。因此,我们必须在完成后执行 N+1 次释放。也许您只想执行 1 次分配(和 1 次免费)。这是可行的,但更棘手。
附录:根据您在 "continue with the array" 部分所做的工作,您可能根本不需要重新分配字符串。在函数 foo()
期间,在函数 returns 之前,所有传递的字符串都保持有效,因此您实际上可以
input[i] = va_arg(va_data, char *);
就像你第一次写的那样。 (在那种情况下,当然,你不需要或不希望我的 for (i = 0; i < size_of_input; i++) free(input[i]);
循环结束。)
我想将输入的字符串分配到一个数组中。要创建动态内存分配,我需要输入中每个单词的字符长度。但是在这种情况下,我该如何使用可变参数函数来做到这一点。
#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;
}
这应该有效:
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 [=11=] */
if(ret == NULL)
{
fprintf(stderr, "out of memory\n");
exit(1);
}
strcpy(ret, str);
return ret;
}
请注意,在所有这些操作中,我们执行了 N+1 次分配:N 次用于字符串,1 次用于指向它们的指针数组。因此,我们必须在完成后执行 N+1 次释放。也许您只想执行 1 次分配(和 1 次免费)。这是可行的,但更棘手。
附录:根据您在 "continue with the array" 部分所做的工作,您可能根本不需要重新分配字符串。在函数 foo()
期间,在函数 returns 之前,所有传递的字符串都保持有效,因此您实际上可以
input[i] = va_arg(va_data, char *);
就像你第一次写的那样。 (在那种情况下,当然,你不需要或不希望我的 for (i = 0; i < size_of_input; i++) free(input[i]);
循环结束。)