[英]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;
。 因此,這意味着o
和org[0]
是指向同一地址的指針。 printf("%s", org[0]->name);
代替 print("%s", org[0][0].name);
。 main()
和函數中使用Organism
,你應該在你的struct中添加typedef
。 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.