如何使用结构体指针设置char name?解决结构体成员访问报错
问题分析与解决方案
这个报错很典型——你把结构体指针当成结构体变量来用啦!p是struct player *类型的指针,访问它的成员得用->而不是.,而且还有个容易踩的坑:字符数组不能直接用=赋值字符串字面量,得用字符串拷贝函数或者初始化方式。下面分两种情况给你讲清楚:
一、直接使用结构体变量设置name
如果不需要用指针,直接声明结构体变量的话,要注意字符数组的赋值规则:
#include <string.h> // 必须包含这个头文件才能用strcpy struct player { char name[20]; struct player *next; }; int main() { // 声明一个结构体变量 struct player p; // 用strcpy给字符数组拷贝字符串内容(不能直接用p.name = "bob") strcpy(p.name, "bob"); // 另一种合法方式:声明时直接初始化(只能在变量声明阶段用) // struct player p = {"bob", NULL}; return 0; }
关键说明:
- 结构体变量用
.访问成员,这是你原本代码里如果把p改成非指针就能用的方式 name是字符数组,数组名是常量指针,不能直接用=赋值字符串字面量(那是把字符串的地址赋值给常量指针,语法不允许),必须用strcpy来拷贝字符串内容到数组里
二、使用结构体指针设置name
如果一定要用指针,得先让指针指向一块有效的内存,再用正确的方式访问成员:
方式1:指针指向已有的结构体变量
#include <string.h> struct player { char name[20]; struct player *next; }; int main() { struct player p; struct player *ptr = &p; // 让指针指向结构体变量p的内存地址 // 写法1:用->直接访问指针的成员(最常用) strcpy(ptr->name, "bob"); // 写法2:解引用指针后用.访问(和上面等价,只是写法繁琐) strcpy((*ptr).name, "bob"); return 0; }
方式2:动态分配内存(堆上创建结构体)
如果需要在程序运行时动态创建结构体,就得用malloc分配内存:
#include <string.h> #include <stdlib.h> // 包含malloc/free的头文件 struct player { char name[20]; struct player *next; }; int main() { // 分配一块结构体大小的内存,指针指向这块内存 struct player *ptr = malloc(sizeof(struct player)); // 必须检查malloc是否成功!避免空指针访问 if (ptr == NULL) { // 处理内存分配失败的情况,比如返回错误码 return 1; } // 用->访问成员并赋值 strcpy(ptr->name, "bob"); // 用完动态分配的内存后,一定要释放,避免内存泄漏 free(ptr); ptr = NULL; // 好习惯:把指针置空,防止变成野指针 return 0; }
关键说明:
- 结构体指针必须用
->访问成员,或者先解引用指针(*ptr)得到结构体变量后,再用.访问 - 动态分配内存时,一定要检查
malloc的返回值,如果返回NULL说明内存分配失败,不能继续操作 - 动态分配的内存必须用
free释放,否则会造成内存泄漏
内容的提问来源于stack exchange,提问作者rebel ion
相关产品推荐
相关产品推荐

