2

course という構造体があり、各コースには複数のノード (別の構造体「ノード」) があります。

ノードの数はさまざまですが、この情報を読み取っているファイルからその数が与えられているため、その数は変数に含まれています。

したがって、構造体内に malloc が必要です。しかし、私は混乱しています。構造体に配列を含めることができることは知っていますが、構造体がヘッダー ファイルにあるため、malloc 配列を作成するコードをどこに配置すればよいかわかりません。これが現時点での私のコードです。どうすれば修正できるのか、malloc配列をどこで初期化すればよいのかわかりません。

struct course {
    char identifier[2];
    int num_nodes;
    struct node *nodes;
    nodes = (struct nodes*)malloc(num_nodes*sizeof(struct node));
};

struct node {
    int number;
    char type[2];
};

私は次のようなことができるようにしたい:

struct node a_node;
struct course a_course;

a_course.nodes[0] = a_node;

等...

私は C をあまり使用したことがありません。C で動的配列を使用するのはこれが初めてです。私の経験はすべて Java から来ています。もちろん、Java は C と同じようにポインターを実際に使用するわけではないので、すべてです。私には少し混乱します。

そのため、いくつかの助けをいただければ幸いです。どうもありがとう:)

4

3 に答える 3

6

最も簡単な方法は、構造体を初期化する関数を作成することです。

void init_course(struct course* c, const char* id, int num_nodes)
{
    strncpy(c->identifier, id, sizeof(c->identifier));
    c->num_nodes = num_nodes;
    c->nodes = calloc(num_nodes, sizeof(struct node));
}

対称性のために、デストラクタを定義することもできます

void destroy_course(struct course* c)
{
    free(c->nodes);
}

これらは次のような使い方があります

struct course c;
init_course(&c, "AA", 5);
/* do stuff with c */
destroy_course(&c);
于 2012-12-06T15:28:23.137 に答える
3

malloc(またはcalloc-構造体に使用することを好む)の目的は、実行時にメモリを動的に割り当てることです。したがって、構造体はオブジェクト定義であるため、次のようになります。

struct course {
    char identifier[2];
    int num_nodes;
    struct node *nodes;
};

コース構造体を使用するプログラムの他の場所で、(i)作成するコースオブジェクトと(ii)そのコース内のノードオブジェクトにメモリを割り当てる必要があります。

例えば

main()
{
   // lets say 1 course
   struct course *my_course;
   my_course = calloc(1, sizeof(struct course));

   // lets say 3 nodes in that course
   struct node *my_nodes;
   my_nodes = calloc(3, sizeof(struct node));

   my_course.num_nodes = 3;
   my_course.nodes = my_nodes;

   //...
   // clean up
   free(my_nodes);
   free(my_course);
}

今、あなたは良いです。終了する前に、必ずメモリを解放してください。

于 2012-12-06T16:07:51.223 に答える
1

この方法で構造体を構造体に直接割り当てることもできます。

最初に構造体を宣言します。

struct course {
    char identifier[2];
    int num_nodes;
    struct node *nodes;
};

次に、プログラムで

main(){ 
    int i;
    struct course *c;
    c = malloc(sizeof(struct course));
    c->num_nodes = 3;
    c->nodes = malloc(sizeof(struct node)*c->num_nodes);

    for(i=0; i<c->num_nodes; i++) 
        c->nodes[i] = malloc(sizeof(struct node));

    //and free them this way
    for(i=0; i<c->num_nodes; i++) 
        free(c->nodes[i]);
    free(c->nodes);
    free(c);


}

または、あなたが好きなものの上にそれをします

于 2012-12-06T19:41:46.220 に答える