2

最近、c言語で配列を扱うのが面倒だと気づきました。
サイズを大きくするには、頻繁にrealloc()を実行する必要があります。
また、C ++のvectorやjavaのArraylistのような標準的なデータ構造はありません。Linux

カーネルには、
kfifoなどのデータ構造があり、これはkfifo_in()、kfifo_out()関数で使用できます。

ただし、これは、ユーザーがkfifo*pointerを定義することを意味します。配列を記録します。この変数には、構造に含まれる型に関する情報は含まれていません。
ユーザーは、kfifoポインターによって動的配列を使用しようとするときに覚えておく必要があります。
少し紛らわしいかもしれません。
問題に対処するためのより良い方法はありますか?Linux cプログラミングの一般的な解決策は何ですか?

4

3 に答える 3

3

reallocコード全体に分散させず、合理的な戦略を使用して動的配列を拡張しない限り、それほど悪くはありません。

C で独自の動的配列をローリングするには、いくつかの簡単な関数を実装するだけです。この演習については、多数の短い記事で説明されています。ここに例を示します。この記事ではstruct、現在使用されているサイズと割り当てられたサイズとともに、動的配列を表す を定義しています。また、構造体によって表される配列を初期化、拡張、および割り当て解除するための関数も提供します。ライブラリには明示的な初期化関数はありませんNULL。最初のパラメーターとして渡すことで初期化します。これは有効なアプローチですが、より伝統的な と の分離を選択することもできinitますgrow

于 2012-06-28T17:08:12.233 に答える
2

Glib arraysを使用します。これは、Linux やその他の OS でよく知られているライブラリであり、Gnome などのプロジェクトで使用されています。

C には動的配列の標準はありません。

于 2012-06-28T17:10:32.730 に答える
0

@青い海

つまり、 struct array{int len; を定義できるということです。int 容量; int each_element_size; void *data;} 要素のバイトをコピーし、データの最後に配置します。– ブルーシー 6 月 29 日 3:04

これは、議論中のライブラリですでに処理されています。付属のマクロと main.c ファイルの例を参照してください。使用されているマクロに応じて、元のデータへのポインターの配列、またはデータのコピーへのポインターの配列のいずれかになります。

FWIW、私はライブラリの作成者であり、エアバッグがないことを最初に認めます。したがって、(C の他のものと同様に) 安全に使用する必要があります。

于 2012-08-15T11:35:34.357 に答える