C语言中如何获取嵌套结构体中函数的返回值?
问题分析与修复方案
Hey,我来帮你拆解下这段嵌套结构体代码里的问题,你遇到的错误主要来自三个关键的C语言基础细节,咱们一个个理清楚:
1. 未初始化的野指针buff
你定义了Machine *buff但没有给它分配内存或者指向一个有效的Machine实例,直接使用buff->PD会触发未定义行为(大概率导致程序崩溃或者奇怪的运行结果)。必须先给buff分配内存,让它指向一块合法的内存区域。
2. 结构体实例与指针类型不匹配
buff->PD是Person类型的结构体实例,而GetPDdata()返回的是Person*类型的指针——C语言里不能直接把指针赋值给结构体变量,这是类型不兼容的错误。你有两种选择:
- 把
Machine结构体里的PD改成指针类型(这样就能用你想要的machine->PD->name形式访问) - 解引用
GetPDdata()返回的指针,把结构体内容拷贝到buff->PD中
3. 字符数组不能直接用=赋值
m1->PD.name是字符数组,C语言不支持直接用=把一个字符数组的值赋给另一个,必须用字符串拷贝函数(比如strcpy或者更安全的strncpy)来完成赋值。
方案一:将Machine中的PD改为指针类型(符合你想要的machine->PD->name访问形式)
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct _Person { char name[20]; int age; } Person; // 将PD改为Person指针类型,支持->链式访问 typedef struct _Machine { char address[100]; Person *PD ; } Machine; Person *GetPersonData(){ Person *pd = (Person*)malloc(sizeof(Person)) ; strcpy(pd->name, "GETperson"); pd->age = 25; // 初始化age字段,避免垃圾值 return pd ; } Machine *GetMachineData(){ Machine *md = (Machine*)malloc(sizeof(Machine)) ; strcpy(md->address, "GETmachine"); md->PD = NULL; // 初始化指针为NULL,避免野指针 return md ; } Person *GetPDdata(){ Person *pd = (Person*)malloc(sizeof(Person)) ; strcpy(pd->name, "GOT Machine people"); pd->age = 30; return pd ; } int main(){ Person *p1; Machine *m1 ; Machine *buff ; p1 = GetPersonData(); printf("Single Person name: %s\n", p1->name); m1 = GetMachineData(); buff = (Machine*)malloc(sizeof(Machine)); // 给buff分配合法内存 buff->PD = GetPDdata(); // 现在类型匹配:Person* 赋值给 Person* // 用你想要的链式访问形式获取子结构体字段 printf("Nested Person name via pointer: %s\n", m1->PD->name); // 记得释放内存,避免内存泄漏 free(p1); free(m1->PD); free(m1); free(buff); return 0; }
方案二:保持PD为结构体实例,拷贝指针指向的内容
如果你希望PD是结构体实例而不是指针,可以通过解引用指针来拷贝内容:
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct _Person { char name[20]; int age; } Person; typedef struct _Machine { char address[100]; Person PD ; } Machine; Person *GetPersonData(){ Person *pd = (Person*)malloc(sizeof(Person)) ; strcpy(pd->name, "GETperson"); pd->age = 25; return pd ; } Machine *GetMachineData(){ Machine *md = (Machine*)malloc(sizeof(Machine)) ; strcpy(md->address, "GETmachine"); return md ; } Person *GetPDdata(){ Person *pd = (Person*)malloc(sizeof(Person)) ; strcpy(pd->name, "GOT Machine people"); pd->age = 30; return pd ; } int main(){ Person *p1; Machine *m1 ; Machine *buff ; p1 = GetPersonData(); printf("Single Person name: %s\n", p1->name); m1 = GetMachineData(); buff = (Machine*)malloc(sizeof(Machine)); // 初始化buff内存 // 临时接收GetPDdata的返回值,解引用后拷贝到buff->PD Person *pd_temp = GetPDdata(); buff->PD = *pd_temp; free(pd_temp); // 内容已拷贝,释放临时指针 // 用strcpy拷贝字符串,直接赋值字符数组会报错 strcpy(m1->PD.name, buff->PD.name); m1->PD.age = buff->PD.age; // 拷贝数值类型字段可以直接赋值 printf("Nested Person name via struct: %s\n", m1->PD.name); // 释放所有分配的内存 free(p1); free(m1); free(buff); return 0; }
内容的提问来源于stack exchange,提问作者Frank.lee
相关产品推荐
相关产品推荐

