是否可以从一个结构继承而不在C中初始化另一个结构



我是一名新的数据结构专业学生,正在努力熟悉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更改为直接指向字符串文字,而不是复制它。这在本例中是不必要的。有多种方法可以决定如何处理名称、如何初始化结构等等

最新更新