C/C++报错‘expression must be a modifiable lvalue(137)’原因咨询
错误原因及解决办法
报错原因
在C/C++中,数组类型属于不可修改的左值。当你写templates[0].frame时,这个表达式代表结构体内部的二维数组,数组名虽然会隐式转换为指向首元素的指针,但它本身不能作为赋值操作的左操作数——你无法直接将另一个数组整体赋值给它,就像不能直接执行int a[5]; int b[5]; a = b;一样,这是语言语法规则的限制。
解决方法
方法1:用memcpy批量复制内存
因为两个数组的类型、大小完全一致,可以直接用memcpy复制整个内存块,效率最高:
#include <string.h> // 必须包含该头文件 memcpy(templates[0].frame, templateForehand1, sizeof(templates[0].frame));
sizeof(templates[0].frame)会自动计算整个二维数组的字节数,确保复制完整。
方法2:逐元素循环赋值
如果需要对每个元素做额外处理,或者不想用内存复制函数,可以手动遍历赋值:
for (int i = 0; i < 3; i++) { for (int j = 0; j < 50; j++) { templates[0].frame[i][j] = templateForehand1[i][j]; } }
方法3:修改结构体为指针类型(按需选择)
如果不需要复制数据,只是想让结构体引用原数组,可以把结构体里的数组改成指针:
struct templ_st { float (*frame)[50]; // 指向包含50个float的一维数组的指针 }; // 直接让指针指向目标数组 templates[0].frame = templateForehand1;
注意:这种方式不会复制数据,原数组内容修改后,结构体通过frame访问到的内容也会跟着变,适合共享数据的场景。
内容的提问来源于stack exchange,提问作者umut utku
相关产品推荐
相关产品推荐

