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
相关产品推荐
相关产品推荐

