C: Передача массива в функцию «на лету»

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

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

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

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

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

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

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

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


person Gerardo Marset    schedule 19.09.2010    source источник


Ответы (3)


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

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

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

person Matthew Flaschen    schedule 19.09.2010
comment
И поэтому, вероятно, недоступен, если компилятор MSVC. - person Jonathan Leffler; 19.09.2010
comment
Спасибо, это как раз то, что мне было нужно. - person Gerardo Marset; 19.09.2010

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

foobar = foo((char *[]){"aa", "bb", "cc"});
person Carl Norum    schedule 19.09.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;
}

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

person Matthew    schedule 19.09.2010