ではありませんなぜ私は小さな構造体の動的配列を保持しなければならないCの構造体に苦しんだ:C・フリー・ダイナミック・アレイ - 彼らはcontigous
typedef struct issueStruct {
int data;
} issue;
typedef struct volumeStruct {
issue* collection;
size_t elements;
} volume;
私は動的にIできるだけ多くの問題の構造体を作成することができますボリューム構造体の配列内のようなものです。私はその配列を通して繰り返すこともできます:
int main(){
volume* TimeMagazine = (volume*)malloc(sizeof(volume));
TimeMagazine->collection = (issue*)malloc(4 * sizeof(issue));
TimeMagazine->elements = 4;
issue* ptr = TimeMagazine->collection;
int i;
// Populate & iterate through array:
i = 0;
while(i < TimeMagazine->elements){
ptr->data = 100*i;
printf("%d) %d\n", i, ptr->data);
i++;
ptr = ptr+i; // Advance ptr
}
return 0;
}
OUTPUT:
[Linux]$ gcc -Wall magazines.c
[Linux]$ ./a.out
0) 0
1) 100
2) 200
3) 300
[Linux]$
これまでのところ、とても良いです。上記のGDBを踏むと、問題の構造体が連続したメモリアドレスを持たないように見えますが、すべてが大丈夫です。私が見たメモリアドレスは次のとおりです。
issue 0) 0x602030
issue 1) 0x602034
issue 2) 0x60203c
issue 3) 0x602048
これは私にいくつかの一時停止を与えました。私はすべての問題が4バイト離れていると仮定していたでしょう。sizeof(issue) = 4
です。もっと真剣に、配列の要素を解放するために "反復スルー"コードを変更すると、私のコードはエラーになります。具体的には、2番目の問題を解決しようとすると失敗します。ここでは、コードがあります:
i = 0;
ptr = TimeMagazine->collection;
issue* ptr2 = ptr;
while(i< TimeMagazine->elements){
printf("freeing %d...\n", i);
i++;
free(ptr2); // free ptr2
ptr2 = ptr = ptr+i; // advance ptr & ptr2
}
ここでエラー(Linux上のGCC)があります:
*** Error in `./a.out': free(): invalid pointer: 0x000000000137c034 ***
だから私は、私はここで何かが欠けてると確信しているが、わからないものを。誰かが配列要素を解放する効果的な方法をお勧めしますか?
多くの感謝!
-Pete
PSは - ポスト「の配列に構造体を解放する」のがたくさんありますが、どれも正確に私がやっているものと一致するように見えたん。だから私はこの質問の私のバージョンがユニークであることを願ってこれを投稿しています。
1つの 'malloc'、1つは' free'です。それがルールです。現時点では、 'collection'配列全体に対して' malloc'を1つだけ持っていて、配列内の各要素に対して1つの 'free'呼び出しを複数持つようにしようとします(ポインタ算術は以下の答えでは間違っています) 。 – kaylum