C语言字符串变量赋值方法及结构体字符成员赋值错误排查
在C语言里,字符串本质是以空字符\0结尾的字符序列,没法像普通变量那样直接用=随意赋值,得根据存储方式选对应的方法:
用字符数组存储(推荐用于需要修改的字符串)
初始化时可以直接赋值:char greeting[15] = "Hello there!";如果是后续修改或赋值,就得用字符串操作函数(记得包含
<string.h>头文件),比如strcpy:char greeting[15]; strcpy(greeting, "Hello there!");担心缓冲区溢出的话,用
strncpy更安全,记得手动补上结尾的空字符:strncpy(greeting, "Hello there!", sizeof(greeting)-1); greeting[sizeof(greeting)-1] = '\0';用字符指针存储(适合只读的字符串)
这种方式更简洁,直接把字符串字面量的地址赋值给指针就行,但要注意字符串是只读的,不能修改内容:const char* greeting = "Hello there!";要是必须修改字符串内容,就得自己用
malloc分配内存,复制完成后记得用free释放,避免内存泄漏。
先揪出问题根源:你定义的_entityAuthor是单个char类型,它只能存一个字符(比如'S'),但你却试图把整个字符串"Shakespear"(这是const char*类型,指向一串字符的起始地址)赋值给它,类型完全不匹配,编译器自然会报错。
给你两种修复方案,按需选择:
方案1:把成员改成字符数组(存储完整字符串)
修改结构体定义,将char改成足够大的字符数组(要能装下目标字符串加结尾的\0):
#ifndef ENTITY_H #define ENTITY_H #include <string.h> // 使用字符串操作函数需要包含这个头文件 struct MyEntityObject { char _entityAuthor[20]; // 20字节足够存储"Shakespear" }; #endif // ENTITY_H
赋值时用strcpy或更安全的strncpy:
struct MyEntityObject myEntityObject; strcpy(myEntityObject._entityAuthor, "Shakespear"); // 安全版写法 // strncpy(myEntityObject._entityAuthor, "Shakespear", sizeof(myEntityObject._entityAuthor)-1); // myEntityObject._entityAuthor[sizeof(myEntityObject._entityAuthor)-1] = '\0';
方案2:用const char*类型的成员(适合只读场景)
如果作者名字不需要修改,可以把成员改成指针类型,直接指向字符串字面量:
#ifndef ENTITY_H #define ENTITY_H struct MyEntityObject { const char* _entityAuthor; }; #endif // ENTITY_H
然后直接赋值即可,不需要字符串操作函数:
struct MyEntityObject myEntityObject; myEntityObject._entityAuthor = "Shakespear";
注意:这种方式下,_entityAuthor指向的是只读内存中的字符串,要是尝试修改内容,会触发未定义行为(比如程序崩溃)。如果需要修改,就得手动用malloc分配内存,复制字符串后记得free释放。
内容的提问来源于stack exchange,提问作者Program-Me-Rev

