2010-09-19 11 views
5

Mam funkcję i chcę przekazać jej tablicę znaków *, ale nie chcę tworzyć zmiennej tylko do tego celu, np. to:C: Przekazywanie tablicy do funkcji "w locie"

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

Aby obejść, że próbowałem to:

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

Ale to nie działa. Próbowałem również:

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

Kompiluje się z ostrzeżeniem i jeśli wykonam program, zawiesza się.
Próbowałem także grać z gwiazdkami i znakami ampersand też, ale nie mogłem zmusić go do prawidłowego działania.

Czy to możliwe? Jeśli tak to jak?

Odpowiedz

16

Tak, można użyć literału złożonego. Zauważ, że będziesz musiał podać jakiś sposób, aby funkcja znała długość tablicy. Jednym z nich jest mieć NULL na końcu.

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

Ta funkcja została dodana w C99.

+0

I dlatego prawdopodobnie nie jest dostępna, jeśli kompilator jest MSVC. –

+0

+1 za wzmiankę o tym, że jest to funkcja C99 –

+0

Dzięki, właśnie tego potrzebowałem. –

5

Musisz zadeklarować typ dla związku dosłownym:

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

kilka razy zmienne argumenty są wystarczające:

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

Ale generalnie preferują metodę zaproponowaną przez Mateusza i Carl.

Powiązane problemy