C: Передача массива в функцию «на лету» - PullRequest
5 голосов
/ 19 сентября 2010

У меня есть функция, и я хочу передать ей массив char *, но я не хочу создавать переменную просто для этого, например:

char *bar[]={"aa","bb","cc"};
foobar=foo(bar);

Чтобы обойти это, я попробовал это:

foobar=foo({"aa","bb","cc"});

Но это не работает. Я также попробовал это:

foobar=foo("aa\0bb\0cc");

Он компилируется с предупреждением, и если я запускаю программу, он зависает.
Я тоже попытался немного поиграть со звездочками и амперсандами, но не смог заставить его работать должным образом.

Это вообще возможно? Если да, то как?

Ответы [ 3 ]

16 голосов
/ 19 сентября 2010

Да, вы можете использовать составной литерал.Обратите внимание, что вам нужно будет предоставить функции способ узнать длину массива.Один из них должен иметь значение NULL в конце.

foo((char *[]){"aa","bb","cc",NULL});

Эта функция была добавлена ​​в C99.

5 голосов
/ 19 сентября 2010

Вам необходимо объявить тип для вашего составного литерала:

foobar = foo((char *[]){"aa", "bb", "cc"});
1 голос
/ 19 сентября 2010

Иногда достаточно аргументов переменной:

#include <stdarg.h>
#include <stdio.h>

void func(int n, ...)
{
  va_list args;
  va_start(args, n);
  while (n--)
  {
    const char *e = va_arg(args, const char *);
    printf("%s\n", e);
  }
  va_end(args);
}

int main()
{
  func(3, "A", "B", "C");
  return 0;
}

Но я обычно предпочитаю метод, предложенный Мэтью и Карлом.

...