static char st[][8192];
void foo ( int tab_size){
st = (char**) malloc ((tab_size+1)*sizeof(char)*8192);
}
stの型が不完全な「malloc」行でコンパイルエラーが発生します。なにが問題ですか?ありがとう。
の定義st
は、実際には完全な型ではありません。
代わりにこれを試してください:
static char (*st)[8192];
void foo (int tab_size){
st = malloc ((tab_size+1)*sizeof(*st));
}
の内部次元のサイズを指定しないためst
、コンパイラーはそれがどれくらいの大きさである必要があるかを知りません。したがって、タイプは不完全malloc
であり、呼び出しの前にタイプを完了することはありません。
あなたの意図は動的に割り当てることであるように見えるのでst
、Oliのアドバイスに従って、次の8192要素配列へのポインタchar
として宣言してください。
static char (*st)[8192];
malloc
ステートメントを次のように書き直します
st = malloc(sizeof *st * (tab_size+1));
sizeof *st
==== sizeof (char [8192])
8192。このフォームは少しすっきりしていて読みやすいです。また、Cでは、の結果をキャストする必要はなくmalloc
(C89より前の実装を使用している場合を除き、その場合は申し訳ありません)、この方法はお勧めしません。
tab_size + 1
これにより、それぞれ8192文字の配列 を保持するのに十分なスペースが割り当てられます。
へのポインタとしてT a[]
宣言するのは、関数パラメータ宣言のコンテキスト内のみです。 a
T
配列と配列へのポインタという2つの完全に異なるタイプを混同しています。
static char st[][8192];
stが配列型であることを宣言します。これは変更可能な左辺値ではなく、に割り当てることはできません。
整数の配列にスペースを割り当て、それをポインターに割り当てることが目的の場合は、OliCharlesworthによって提案されたポインター宣言を使用してください。
ただし、stの宣言ではスペースが割り当てられないことに注意してください。このようなことをしようとすると、エラーが発生します。
printf("0x%x\n", st);
コンパイラはそれを宣言のように扱い、他の場所で実際の定義を確認することを期待しています。配列の最初の次元の値を指定していないため、これは定義ではありません。