0
static char st[][8192];
void foo ( int tab_size){
    st = (char**) malloc ((tab_size+1)*sizeof(char)*8192);
}

stの型が不完全な「malloc」行でコンパイルエラーが発生します。なにが問題ですか?ありがとう。

4

3 に答える 3

1

の定義stは、実際には完全な型ではありません。

代わりにこれを試してください:

static char (*st)[8192];

void foo (int tab_size){
    st = malloc ((tab_size+1)*sizeof(*st));
}
于 2012-04-06T17:50:11.870 に答える
1

の内部次元のサイズを指定しないため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[]宣言するのは、関数パラメータ宣言のコンテキスト内のみです。 aT

于 2012-04-06T18:05:59.420 に答える
0

配列と配列へのポインタという2つの完全に異なるタイプを混同しています。

static char st[][8192];

stが配列型であることを宣言します。これは変更可能な左辺値ではなく、に割り当てることはできません。

整数の配列にスペースを割り当て、それをポインターに割り当てることが目的の場合は、OliCharlesworthによって提案されたポインター宣言を使用してください。

ただし、stの宣言ではスペースが割り当てられないことに注意してください。このようなことをしようとすると、エラーが発生します。

printf("0x%x\n", st);

コンパイラはそれを宣言のように扱い、他の場所で実際の定義を確認することを期待しています。配列の最初の次元の値を指定していないため、これは定義ではありません。

于 2012-04-06T18:01:44.813 に答える