动态数组的可变参数函数?

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]); 循环结束。)