C++通过结构体数组对象初始化结构体char数组报错问题问询
错误原因
- 语法层面:
v[0].name[]写法不合法,访问单个数组元素需要指定下标,若要操作整个数组无需加[]后缀 - 核心规则层面:C/C++中字符数组不支持直接通过
=赋值字符串,数组名是固定的地址常量,不可作为左值被赋值
解决方案
方案1:使用字符串拷贝函数(兼容现有C风格代码)
你已经引入了<string.h>头文件,使用strncpy完成字符串拷贝即可,该方法可以避免缓冲区溢出风险:
#include <iostream> #include <string.h> using namespace std; struct emp { int age; char name[10]; }; int main() { struct emp v[2]; v[0].age = 9; strncpy(v[0].name, "name1", sizeof(v[0].name) - 1); v[0].name[sizeof(v[0].name) - 1] = '\0'; // 手动补字符串结束符,避免源字符串过长时输出异常 v[1].age = 10; strncpy(v[1].name, "name2", sizeof(v[1].name) - 1); v[1].name[sizeof(v[1].name) - 1] = '\0'; for (int i = 0; i < 2; i++) { cout << v[i].age << " " << v[i].name << endl; } return 0; }
方案2:声明变量时直接初始化
如果赋值逻辑可以在变量定义阶段完成,用初始化列表的写法更简洁:
int main() { struct emp v[2] = { {9, "name1"}, {10, "name2"} }; for (int i = 0; i < 2; i++) { cout << v[i].age << " " << v[i].name << endl; } return 0; }
方案3:改用std::string(C++推荐写法)
无需兼容C语法的前提下,把结构体内部的char数组替换为std::string类型,即可直接使用=赋值字符串,无需手动处理内存和结束符,安全性更高:
#include <iostream> #include <string> using namespace std; struct emp { int age; string name; }; int main() { struct emp v[2]; v[0].age = 9; v[0].name = "name1"; v[1].age = 10; v[1].name = "name2"; for (int i = 0; i < 2; i++) { cout << v[i].age << " " << v[i].name << endl; } return 0; }
内容的提问来源于stack exchange,提问作者ayeyo
相关产品推荐
相关产品推荐

