1

私の C コードには約 300 バイト (5xint + 256 文字) の構造体があり、この構造体のすべての「オブジェクト」を処理するための配列の優れたメカニズムが必要です。最初は配列内のすべてのインデックスがNULLを指すように、ポインターのグローバル配列が必要ですが、必要に応じて各インデックスを初期化し(malloc)、完了したら削除します(無料)。

typedef struct myfiles mf;
mf* myArr[1000];

それは私が探しているものですか?ポインターが配列と混在していると、よく混乱します。もしそうなら、明確にするために、

mf myArr[1000];

スタックに 1000 個の構造体を既に割り当てていますが、最初の提案では 1000 個のポインタしか割り当てられませんか?

4

4 に答える 4

3

あなたは正しいです。前者は1000個のポインタを割り当てますが、いずれも初期化されません。後者は、それぞれ最大300バイトの1000個のオブジェクトを初期化します。

nullに初期化するには: foo_t* foo[1000] = {NULL};

しかし、これはまだばかげています。なぜだけではないのmf* myArr = NULLですか?これで、初期化されたメモリへの1000個のポインタと、追跡する1個のポインタではなく、初期化されていないメモリへの1個のポインタができました。どちらかと言えば

myArraySingle = malloc(sizeof(mf)*1000);また

for(int i = 0; i < 1000; i++) {
    myArray[i] = malloc(1000);
}

myArraySingle[300]そして、または*(myArray [300]) `によるアクセス?とにかく私のポイントは構文はさておき、この不必要な間接参照を作成しないでください。単一のポインターは、配列のようにオブジェクトのシーケンスを保持する連続したメモリーのチャンクを指すことができます。そのため、ポインターは配列スタイルの構文をサポートし、配列インデックスは0から始まります。

于 2013-03-04T05:01:51.297 に答える
1
typedef struct myfiles mf;
mf* myArr[1000];

これはあなたが探しているものです。これにより、1000 個のポインターの配列が構造体 mf に割り当てられます。

于 2013-03-04T05:03:10.100 に答える
1

正しく理解しているようです。

より正確にはmf* myArr[1000] = { 0 };、すべての要素が null ポインターに初期化されることを保証する必要があるため、要件を満たす方がよいと思います。初期化がなければ、その保証は存在しません。

Cには「グローバル」はありません。ファイルスコープで宣言された静的ストレージ期間を持つオブジェクトを参照しています。

于 2013-03-04T05:08:15.913 に答える
0
typedef struct myfiles mf;
mf* myArr[1000];

はい、1000 個のポインターを初期化します。使用する前に、malloc/calloc を使用してそれぞれにメモリを割り当てる必要があります。

于 2013-03-04T06:42:58.463 に答える