You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++通过结构体数组对象初始化结构体char数组报错问题问询

错误原因

  1. 语法层面:v[0].name[]写法不合法,访问单个数组元素需要指定下标,若要操作整个数组无需加[]后缀
  2. 核心规则层面: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 16:06:04