/ /動的に構造体の配列を拡張するC [duplicate] - c、配列、ポインタ、構造体

動的に構造体の配列を拡張するC [duplicate] - c、配列、ポインタ、構造体

私の学校プロジェクトでは、大規模なCSVファイルが stdin 列に基づいてソートし、ソートされたcsvファイルとして出力する必要があります。

今私が踏んでいるステップは、 realloc〜を送る struct 配列のうちのどれからデータを保持するのに十分な大きさがなければ stdin。 CSVファイルに入力される行の正確な量はわかりませんが、今は静的な量を使ってテストし、その値が structs。

私はまだCの初心者ですので、配列を反復処理するようにポインタをどのように反復するのかはわかりません。静的な量の struct配列の中で、私たちは array[i] Javaのようなものですが、どのようにして *array

私はこの動的配列を作成するためにどこから始めるべきかわかりません。私は試した

struct array* testArray = (array*)malloc(sizeof(testArray));

しかし、私は静的な配列を使っていたように、それをどのように反復するのか分かりません array[i].

どんな助けでも大歓迎です、テキストの壁には申し訳ありません...

回答:

回答№1は0

mallocされたスペースは、配列と同じように(インディケーションを使用して)移動できますが、主な問題はmallocを使用することにあります。 Mallocの引数は、 バイト あなたが割り当てたいのです。だから、もしあなたが構造体の配列を持っていたいなら、まず一つの構造体が含んでいるバイト数を調べる必要があります sizeof(struct array)次に、あなたが望む配列の大きさを決定しましょう。 N。そのコード行はもっと似ているはずです struct array* testArray = malloc(N * sizeof(struct array));。 mallocの戻り値は空白になります割り当てられたスペースの最初のバイトのメモリアドレスを含むポインタ。この値をtestArrayに代入すると、割り当てられた変数型に型キャストされます(struct array *)。ポインタ演算を使用して特定のインデックスにアクセスできるようになりました i 〜と *(testArray + i)、または単純にtestArray [i]。あなたがそれを見つけたら N 十分なサイズではありませんでしたが、reallocを使用して配列のサイズを 2N、または必要と思われるどんな大きさであってもよい。


回答№2の場合は0
struct array* testArray = (array*)malloc(sizeof(testArray));

あなたがtestArrayの1要素だけを割り当てるため、少し間違っています。

それはもっと似ています:

struct A
{
int a;
int b;
....
};

struct A* arr = malloc( N * sizeof(struct A) );
^^^
N element of struct A

int j;
for (j=0; j<N; ++j)  // Iterate it like any other array
{
arr[j].a = 5;
arr[j].b = 42;
....
}

つかいます realloc あなたがアレイを成長させる必要があるとき。

ファイル/ stdinから読み込むと、(David C. Rankinのコメントに基づいて)次のようになります。

int n=0; // Count of the number of structs read from the file

struct A* arr = malloc( N * sizeof(struct A) );
while (read line from file)
{
arr[n].a = val1;
arr[n].b = val2;
++n;              // Increment count
if (n == N)       // Check if current array is full, i.e. realloc needed
{
// realloc array to 2 * N; N = N * 2
}
}