簡體   English   中英

指向struct數組的指針數組

[英]Array of pointers to array of struct

我是C初學者,我需要幫助。 我有一個這樣的結構如下:

    struct {
        char*   name;
        int     level;
        int     spring_prob;
        int     population;
    } Organism;

必須將具有相同級別的生物分組到相同的陣列中以創建類似的情況:

    +++++         +++++++++++++++++++++++++++
    | 0 |  -->    | organism_0 | organism_1 |
    +++++         ++++++++++++++++++++++++++++++++++++++++
    | 1 |         | organism_2 | organism_3 | organism_4 |
    +++++         ++++++++++++++++++++++++++++++++++++++++
    | 2 |         | organism_5 |
    +++++         ++++++++++++++
     org

i created an array to pointer to array of struct: 我創建了一個指向struct數組的數組:

    int main {
        ...
        Organism *org[];
        load_organism(org);
        show(org);
        return 0;
    }
    void load_organism (Organism *org[]){
        Organism o[3];
        o[0].name = "abc";
        o[0].level = 0;
        o[0].spring_prob = 25;
        o[0].population = 300;

        o[1].name = "def";
        o[1].level = 0;
        o[1].spring_prob = 25;
        o[1].population = 20;

        o[2].name = "ebs";
        o[2].level = 0;
        o[2].spring_prob = 25;
        o[2].population = 20;

        *org[0] = o;
    }
    void show (Organism* org[]) {
        print("%s", org[0][0].name);
    }

of the first organism. 當我嘗試打印第一個生物的時,它會崩潰。 我希望你能幫助我找到錯誤。 提前致謝。

您應該看到許多帶有該代碼的編譯器警告。

例如,當你將o (它是一個Organism[] )分配給*org[0] ,這是一個Organism 注意那些警告。

在這種情況下,你的意思是說:

org[0] = o;

但是最終會失敗,因為o是一個局部變量,當函數返回時它的內存將被丟棄。

相反,創建它:

Organism *o = malloc(3 * sizeof(Organism));

清理完這些后,您需要實際為org分配一些內存,這是未初始化的。 分配給其成員時的壞消息。

要么給陣列一個特定的大小,如下所示:

Organism *org[10];

或按上述方式分配:

Organism **org = malloc(10 * sizeof(Organism *));

要么

Organism **org = calloc(10, sizeof(Organism *));

當程序退出時,如果你去malloc()路由,請務必free() org任何成員和org本身。

請注意,您正在定義一個指向Organism數組。 然后你訪問這個數組的偏移量0(這已經是未定義的行為)和那里用作指向內存的指針的垃圾,它現在應該保存o的副本。 (另外我不知道你是如何設法編譯這一行的: *org[0] = o;

同意我,即使你會在某個時刻發生段錯:)。

定義此數組的固定大小:

#define NUM_OF_ORGANISMS 10

int main()
{
    Organism *org[NUM_OF_ORGANISMS];
    ....
}

然后在load_organism你需要為新的Organism分配內存:

org[0] = malloc(sizeof(Organism));
*org[0] = o[0];

或者將org定義為

Organism** org;

然后動態分配數組的大小及其每個條目。

org = malloc(sizeof(Organism*)*NUM_OF_ORGANISMS);
....
org[i] = malloc(sizeof(Organism));
...
// now you can access it
*org[i] = ...

PS

並且在使用完畢后不要忘記free內存:)

陣列Organism o[3]; 范圍僅限於函數void load_organism()

您正在嘗試在函數退出后訪問它。 這會調用未定義的行為。

  • 你必須意味着org[0] = o; 而不是*org[0] = o; 因此,這意味着oorg[0]是指向同一地址的指針。
  • 但是,你必須指printf("%s", org[0]->name); 代替
    print("%s", org[0][0].name);
  • 此外,如果你想在main()和函數中使用Organism ,你應該在你的struct中添加typedef
  • 您需要初始化struct數組或分配的顯式大小
  • 最終,在調用函數之后, o當然是load_organism局部變量。 你應該使用malloc()

固定代碼:

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

typedef struct {
    char*   name;
    int     level;
    int     spring_prob;
    int     population;
} Organism;

void load_organism (Organism *org[]){
    Organism *o = malloc(3 * sizeof(Organism));
    o[0].name = "abc";
    o[0].level = 0;
    o[0].spring_prob = 25;
    o[0].population = 300;

    o[1].name = "def";
    o[1].level = 0;
    o[1].spring_prob = 25;
    o[1].population = 20;

    o[2].name = "qwe";
    o[2].level = 0;
    o[2].spring_prob = 25;
    o[2].population = 20;

    org[0] = o;
}
void show (Organism* org[]) {
    printf("%s", org[0]->name);
}

int main()
{
    Organism *org[3];
    load_organism(org);
    show(org);
    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM