2

私は多かれ少なかれアイデアを持っていますが、正しいアイデアを持っているかどうかはわかりません。おそらく、明らかな何かが欠けているのではないかと期待していました。基本的に、私は次のような文字列の配列(C文字列、つまり基本的に文字配列へのポインタの配列)を持っています。

char **words;

最終的にいくつの単語になるかわかりません。文字列を解析するときに、配列のサイズを変更し、単語へのポインターを追加して、次の単語に移動してから繰り返すことができるようにしたいと思います。

私が考えることができる唯一の方法は、配列の最後に到達するたびに妥当な数から始めて再割り当てすることですが、それが機能するかどうかは完全にはわかりません。words [0]、words[1]などにアクセスできるようにしたいようです。char**words [10]があり、

realloc(words, n+4)  //assuming this is correct since pointers are 4 bytes

配列の最後に到達したら、words [11] = new wordを実行した場合、それも有効ですか?

4

3 に答える 3

3

アレイサイズを追跡します。

size_t arr_size = 10;

そしてそれにメモリの最初のチャンクを与えます:

char **words = malloc( arr_size * sizeof(char*) );

すべての位置を埋めたら、配列サイズを2倍にすることができます。

size_t tailIdx = 0;

while( ... ) {
    if( tailIdx >= arr_size ) {
        char **newWords;
        arr_size *= 2;
        newWords = realloc(words, arr_size * sizeof(char*) );
        if( newWords == NULL ) { some_error() };
        words = newWords;
    }
    words[tailIdx++] = get_next_word();
}

...

free(words);
于 2013-01-17T00:49:01.293 に答える
2

そのアプローチは問題ありませんが、realloc(words, n * 2)代わりに実行することをお勧めします。呼び出しreallocmallocコストがかかるため、再割り当てをできるだけ少なくする必要があります。これは、再割り当て(および場合によってはデータのコピー)を行わなくても、より長く実行できることを意味します。これは、割り当てとコピーのコストを償却するためにほとんどのバッファが実装される方法です。したがって、スペースが不足するたびに、バッファーのサイズを2倍にするだけです。

于 2013-01-17T00:46:29.397 に答える
2

おそらく、メモリの複数のブロックを割り当てたいと思うでしょう。1つはwords、ポインタの配列を含みます。次に、各単語の別のブロック。これは、words配列内の要素によってポイントされます。

次に、要素を追加realloc()するには、words配列を割り当ててから、新しい単語ごとに新しいメモリブロックを割り当てる必要があります。

クリーンアップコードの記述方法に注意してください。これらのブロックをすべて解放する必要があります。

于 2013-01-17T00:47:28.667 に答える