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

C语言中如何修改嵌套结构体内部的结构体元素值?

嵌套结构体成员修改的正确方法

你的代码编译失败是3个基础语法问题叠加导致的,逐一修正即可:

核心错误点说明

  • 类型名拼写错误
    你通过typedef给外层结构体定义的别名是Dad,但main函数里声明变量时写的是Vater Martin, *pDad;,C语言中不存在Vater这个类型。老版本C标准会把未声明的标识符默认按int类型处理,导致编译器把Martin识别为整型变量,后续用.访问结构体成员时类型完全不匹配,就是你看到的expression must have pointer-to-object type but it has type "Tochter".报错的直接来源。
  • scanf传参错误
    scanf读取输入值时需要传入变量的内存地址,你写的scanf("%i", Martin.numofdaugh);缺少取地址符&,属于非法内存访问,就算编译过了运行也会崩溃。
  • 字符数组不能直接用=赋值
    你用typedef定义的Name本质是长度100的字符数组,C语言中数组名是不可修改的左值,不能直接把字符串常量的地址通过=赋值给数组。不管是通过结构体指针还是普通结构体变量访问到name成员,直接写xxx.name = "Alice"都是非法语法。

嵌套结构体成员的访问规则

  • 普通结构体变量访问成员:从外层到内层逐层用.运算符定位,数组成员加下标即可,比如Martin.kleine[0].age
  • 结构体指针访问成员:第一层用->运算符解引用指针访问成员,后续逐层还是用.定位,比如pDad->kleine[0].height
    你写的pDad->kleine[0].name、Martin.kleine[0].name这两个成员访问路径本身是正确的,错在赋值方式。

正确赋值方法

字符数组类型的成员赋值字符串,需要用strcpy(或更安全的strncpy,注意手动补字符串结束符)做内存拷贝。
修正后的可运行代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef char Name[100];

typedef struct Daughter
{
    Name name;
    int age;
    int height;
}Tochter;

typedef struct Father
{
    Tochter kleine[6];
    Name v;
    int age;
    int height;
    int numofdaugh;
}Dad;

int main (void)
{
    // 修正类型名,使用已定义的Dad类型
    Dad Martin, *pDad;
    printf("How many Daughters? ");
    // 修正scanf传参,传入numofdaugh的地址
    scanf("%i", &Martin.numofdaugh);

    pDad = &Martin;
    // 用strcpy给字符数组拷贝字符串
    // 指针方式访问赋值
    strcpy(pDad->kleine[0].name, "Alice");
    // 普通变量方式访问赋值写法同理,路径正确即可
    // strcpy(Martin.kleine[0].name, "Alice");

    // 验证结果
    printf("First daughter name: %s\n", pDad->kleine[0].name);
    return 0;
}

补充说明

如果要封装函数修改结构体成员,直接传入结构体指针作为参数即可,在函数内部通过->逐层定位成员,字符数组成员还是用strcpy拷贝赋值,数值类成员(int、float等)可以直接用=赋值。

内容的提问来源于stack exchange,提问作者AymaNy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 23:24:24