C++动态结构体数组复制时char数组成员赋值报invalid array assignment错误
报错根源
触发invalid array assignment的核心原因是:你定义的Agent结构体中,name和location都是固定长度的char数组(也就是C风格字符串)。C++语法规则明确禁止直接用=运算符对数组做整体赋值——因为数组名本质是指向数组首元素的地址常量,代码里写encryptArr[i].name = agentArr[i].name,相当于试图给常量地址重新赋值,自然会触发语法报错。
适配课程知识范围的解决方法
因为作业要求不能用未学习的memcpy函数,可直接使用已经掌握的C风格字符串处理逻辑完成复制,不需要引入超纲内容:
- 对于
idNum、years这类基础数值类型的结构体成员,原有直接赋值的写法完全合规,不需要修改 - 对于
name、location两个char数组类型的成员,用课程必然已经讲授过的strcpy函数完成逐字符拷贝即可,这个函数的作用就是把源C字符串的内容完整复制到目标字符数组中,完全满足复制需求。
修改后的正确代码
首先需要在代码头部引入strcpy对应的标准库头文件:#include <cstring>
Agent *copyEncryptArray(Agent *agentArr, int numOfAgents) { Agent *encryptArr = new Agent[numOfAgents]; for (int i = 0; i < numOfAgents; i++) { // 基础数值成员直接赋值即可 encryptArr[i].idNum = agentArr[i].idNum; encryptArr[i].years = agentArr[i].years; // C字符串成员用strcpy完成逐字符复制,替代原来错误的数组直接赋值 strcpy(encryptArr[i].name, agentArr[i].name); strcpy(encryptArr[i].location, agentArr[i].location); // 后续需要实现的加密逻辑,可以直接在循环内对拷贝后的字符做变换,不需要额外遍历 } return encryptArr; }
注意事项
strcpy在复制时会自动在字符串末尾补上C字符串要求的\0结束符,完全适配你结构体中定长char数组的存储格式- 这种实现方式完全没有用到超纲的内存操作函数,符合课程作业的知识范围要求,也能顺畅接入后续的加密逻辑。
内容的提问来源于stack exchange,提问作者user14457475
相关产品推荐
相关产品推荐

