我是一名新的数据结构专业学生,正在努力熟悉c结构。我知道继承自我过去的python经验,所以我想在c中进行伪尝试。我的代码如下:
typedef struct{
char name[20];
int age;
int weight;
int selling_price;
} Animal;
typedef struct{
Animal *animal;
int can_speak;
}super_animal;
int main() {
Animal monkey;
strcpy(monkey.name,"Mustafa");
monkey.age=19;
monkey.weight=80;
super_animal human;
human.animal=&monkey;
human.can_speak=1;
printf("%s, can speak bool:%dn",human.animal->name,human.can_speak);
return 0;
}
我想从代码中去掉中间的猴子步骤。有可能像那样使用未分配的结构指针吗?
只要animal
具有类型Animal *
,则必须指向有效内存才能使用。该内存不必有名称,也不必被另一个有名称的指针引用。也就是说,您可以通过直接为human
:分配内存来删除单独的monkey
变量
super_animal human = { .animal = malloc(sizeof *human.animal), .can_speak = 1 };
if (human.animal == NULL)
HandleError();
strcpy(human.animal->name, "Mustafa");
human.animal->age = 19;
human.animal->weight = 80;
如果将animal
成员的类型改为Animal
而不是Animal *
:
typedef struct{
Animal animal;
int can_speak;
}super_animal;
因此,将Animal
结构直接嵌入到super_animal
结构中,则不需要提供单独的内存:
super_animal human = { .animal.name = "Mustafa", .animal.age = 19, .animal.weight = 80, .can_speak = 1 };
printf("%s, can speak bool:%dn",human.animal.name,human.can_speak);
请注意,这会将.animal.name
更改为直接指向字符串文字,而不是复制它。这在本例中是不必要的。有多种方法可以决定如何处理名称、如何初始化结构等等