0

C で「構造体」を動的に割り当てる概念を理解しようとしています。また、一般的な動的割り当てにも興味があります。このトピックに関するヘルプや情報を教えてください。

私はポインターの概念を理解することができ、何らかのコードを作成することができましたが、それが正しいかどうか、または本来あるべきように機能しているかどうかはわかりません...

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    typedef struct {
        int id;
        char nume[20];
    } pers;

    pers *i = malloc(sizeof(pers)*100);

    i->id=22;
    i++;
    i->id=33;
}

私の質問は、この配列を適切に宣言したか、この配列の要素を出力する方法、eq の特定の要素を参照する方法です。i[9]、同じことを行う別の方法はありますか? 一般的な動的割り当てメモリについて聞いたことがあります。その?

4

5 に答える 5

4

するとi++、元のポインターが失われます。代わりに、通常の配列インデックスを使用できます。

i[0].id = 22;
i[1].id = 33;

割り当てられたメモリを後で解放する場合は、元のポインターが必要です。

于 2013-03-07T12:56:41.243 に答える
2

以下はすべて同義語です。

*(i + 9)

*(9 + i)

i[9]

9[i]

于 2013-03-07T12:55:34.647 に答える
2

自動配列の要素を参照するのと同じ方法で、動的に割り当てられた配列の要素を参照します。

Usingpers[i]は i 番目の要素を参照します。を使用するようなフィールドにアクセスするidにはpers[i].id

于 2013-03-07T12:57:15.470 に答える
2

通常、関数のtypedef struct前 (外側) に実行しますが、機能します。

あなたの割り当ては正しいです。

しかしi++、ここでは意味がありません。i割り当てられたメモリの開始位置がわかるように、ポインターを保持する必要があります。おそらく必要なのは、配列への別のポインターであり、それを増やします。

pers* it = i;
it->id=22;
printf("%d", it->id);
it++;
it->id=33;
printf("%d", it->id);
于 2013-03-07T13:00:35.873 に答える
1

malloc から返されたポインターを変更しないでください。メモリ リーク(割り当てられたメモリへのポインタを割り当てて失う) の発生を避けるために、定数のように扱います。を変更する代わりにi、新しいインデックス変数を使用して反復し、それを呼び出しましょうj: すべての配列要素をクリア/初期化するには:

#include <string.h> /* for memset(). */
int j;
for (j=0; j<100; ++j) {
  i[j].id = 0;
  memset (i[j].nume, 0, 20); /* Or sizeof(i[0].nume) instead of 20. */
}

すべての配列要素を出力するには:

for (j=0; j<100; ++j) {
  printf ("id[%d] = %d\n", j, i[j].id);
  printf ("nume[%d] = '%s'\n", j, i[j].nume);
}

iに名前を変更することもお勧めしpersonます。これにより、コードが非常に読みやすくなります。

于 2013-03-07T13:03:50.670 に答える