どうすれば次のことができますか。
void foo(char* x[] = { "hello", "my", "friend" });
あなたはほとんどそれを作りました... ;-)
C99 以降を実行する場合は、次のような複合リテラルを使用します。
foo((char *[]){"hello", "my", "friend"});
呼び出された関数 (foo()
ここ) には、ポインター配列に含まれる要素の数がわからないことに注意してください。そのため、最終的な null ポインターをセンチネルとして追加する必要があります。
foo((char *[]){"hello", "my", "friend", NULL});
例:
#include <stdio.h>
#include <stdlib.h> /* for EXIT_xxx macros */
void foo(char **arr)
{
while (arr && *arr)
{
printf("%s\n", *arr);
++arr;
}
}
int main(void)
{
foo((char *[]){"hello", "my", "friend", NULL}); /* Mind the final NULL. */
return EXIT_SUCCESS;
}
これは印刷されます:
hello
my
friend
複合リテラルは、定義されたスコープが残されるまで有効です (main()
ここ)。使用直後にスタックから確実に削除されるようにしたい場合はfoo()
、ローカル スコープ/ブロックを作成するための呼び出しを中かっこで囲みます。
int main(void)
{
{
foo((char *[]){"hello", "my", "friend", NULL}); /* Mind the final NULL. */
}
/* The compound literal passed to foo() is already deallocated here, had been
removed from the stack. */
...