结构副本的问题

时间:2012-09-05 16:13:33

标签: pointers compiler-errors visual-studio-2005 c89

在尝试从一个位置到另一个位置进行结构复制时,我在使用标准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%正确,如果有人指出问题或需要澄清的话,我会编辑问题。 )

2 个答案:

答案 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。