变量函数到动态数组?

时间:2018-01-04 11:57:22

标签: c variadic-functions dynamic-memory-allocation

我想将输入中的字符串分配到数组中。要创建动态内存分配,我需要输入中每个单词的字符长度。但是在这种情况下如何使用可变参数函数来执行此操作。

#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;
}

1 个答案:

答案 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]);循环。)