为什么给结构体字符数组成员赋值字符串字面量会报错?
错误原因说明
这个错误和字符串字面量的常量属性没有关系,核心问题是C语言语法不允许对数组类型直接执行赋值操作:
你定义的name、country都是长度为20的char数组类型,在C语法中数组名属于不可修改的左值,无法出现在赋值运算符=的左侧,哪怕右值是相同长度的非const字符数组,也会触发同类型报错。
将结构体成员声明为常量不能解决问题
把成员声明为const反而会完全禁止修改成员的值,完全偏离需求,无法解决当前报错。
正确的赋值方式
你可以选择以下任意一种方案实现赋值需求:
- 使用字符串拷贝函数
引入<string.h>头文件后,用strcpy/strncpy把字符串内容拷贝到数组成员中,推荐用更安全的strncpy避免缓冲区溢出:#include <string.h> // 赋值逻辑 strncpy(d1.name, "Constantine", sizeof(d1.name) - 1); d1.name[sizeof(d1.name) - 1] = '\0'; // 手动补字符串结束符,防止超长时缺省 strncpy(d1.country, "Byzantium", sizeof(d1.country) - 1); d1.country[sizeof(d1.country) - 1] = '\0'; - 结构体初始化时直接赋值
定义结构体变量的同时完成初始化,初始化操作不属于赋值,语法允许直接匹配字符串字面量:// 基础初始化写法 struct details d1 = {"Constantine", 0, "Byzantium"}; // C99及以上支持的指定初始化写法,更清晰 struct details d1 = {.name = "Constantine", .country = "Byzantium"}; - 调整结构体成员类型为指针
如果不需要修改存储的字符串内容,可以把数组成员改成char*指针类型,直接赋值字符串字面量:struct details { char *name; int age; char *country; }; // 此时赋值操作合法,注意指针指向的字符串字面量是只读的,不能修改内容 d1.name = "Constantine"; d1.country = "Byzantium";
内容的提问来源于stack exchange,提问作者LordObnoxious
相关产品推荐
相关产品推荐

