在尝试从一个位置到另一个位置进行结构复制时,我在使用标准C编译器的Visual Studio 2005中遇到编译器问题。
类型在文件中定义如下:
definition.h
#define MAX 7
typedef struct{
char recordtext[18];
boolean recordvalid;
}recordtype;
typdef recordtype tabletype[MAX];
typedef struct{
tabletype table;
}global_s;
让我们假装一个global_s“对象”被实例化并在某处初始化,并创建了一个指向这个结构的指针。
#include "definition.h"
global_s global;
global_s* pglobal = &global;
init(&pglobal);
同时,在另一个文件中(这是我的问题所在)我试图创建一个本地tabletype对象,并用全局表成员填充它,使用get方法来保护全局(让我们假装它是“静态“)
#include "definition.h"
extern global_s* pglobal;
tabletype t;
gettable(&t);
void gettabl (tabletype* pt)
{
*pt = pglobal->table;
}
当我去编译时,gettable函数中的行会引发编译器错误“错误C2106:'=':左操作数必须是l值。看起来这应该像普通的复制操作一样,并且事实上,如果我在更基本的结构上执行类似的操作,我不会得到错误。例如,如果我复制一个只包含两个整数的结构。
有没有人有一个可靠的解释,为什么这个操作似乎不正确?
(免责声明:我已将此代码开发为我的实际代码的擦除版本,仅用于示例目的,因此在语法上可能不是100%正确,如果有人指出问题或需要澄清的话,我会编辑问题。 )
答案 0 :(得分:0)
它是结构中的数组;他们无法分配。您应该为每个结构定义一个operator =(),并在数组上使用memcpy,或者按元素循环复制它们。
答案 1 :(得分:0)
(如果您想获得对全局变量的引用):
我不确定,如果这是正确的(和问题),但我认为除了函数原型,数组和指针(对于数组1.元素)并不完全相同。指向数组的指针和指向数组的1.元素的指针之间存在差异
也许接受阵列的地址:
*pt = &(pglobal->table);
无论如何,最好不要获取整个数组的地址而是获取第一个元素的地址,以便生成的指针可以直接用作记录数组(不需要解除引用)
recordtype* gettable (size_t* puLength)
{
*puLength = MAX;
return &(pglobal->table[0]);
}
(如果你想要一份表格):
无法在C90中复制数组,当然您必须提供目标内存。然后,您将定义一个函数get表,如下所示:
void gettable (recordtype * const targetArr)
{
size_t i = 0;
for (; i < MAX; i++) targetArr[i] = pglobal->table[i];
return;
}
gettable的完全等效的函数原型是:
void gettable(recordtype[] targetArr);
当涉及到函数参数时,通过引用提供数组作为指向第一个元素的指针。您可以再次请求指向整个数组的指针,并在gettable中取消引用它。但你总是要复制元素。
您可以使用memcopy来完成1-liner的工作。现代编译器应该生成同样有效的代码AFAIK。