You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:21:10