Pointers 结构副本的问题

Pointers 结构副本的问题,pointers,compiler-errors,visual-studio-2005,c89,Pointers,Compiler Errors,Visual Studio 2005,C89,在VisualStudio2005中,当我尝试从一个位置复制到另一个位置时,使用标准C编译器时,我遇到了一个编译器问题 这些类型在文件中定义如下: definition.h #define MAX 7 typedef struct{ char recordtext[18]; boolean recordvalid; }recordtype; typdef recordtype tabletype[MAX]; typedef struct{ tabletype ta

在VisualStudio2005中,当我尝试从一个位置复制到另一个位置时,使用标准C编译器时,我遇到了一个编译器问题

这些类型在文件中定义如下:

definition.h

#define MAX 7

typedef struct{
   char    recordtext[18];
   boolean recordvalid;
}recordtype;

typdef recordtype tabletype[MAX];

typedef struct{
   tabletype table;
}global_s;
让我们假设在某个地方实例化并初始化了一个全局对象,并创建了指向该结构的指针

#include "definition.h"

global_s global;
global_s* pglobal = &global;
init(&pglobal);
同时,在另一个文件中(这就是我的问题所在),我试图创建一个本地tabletype对象,并用全局表成员填充它,使用get方法保护全局(让我们假设它是“静态的”)

当我开始编译时,gettable函数中的行抛出一个编译器错误错误C2106:“=”:左操作数必须是l值。看起来这应该像一个普通的复制操作,事实上,如果我在一个更基本的结构上执行类似的操作,我不会得到错误。例如,如果我复制一个只包含两个整数的结构

是否有人对该操作似乎不正确有可靠的解释


(免责声明:我已将此代码开发为实际代码的擦洗版本,例如,因此它在语法上可能不是100%正确的,如果有人指出问题或需要澄清的内容,我将编辑此问题。)

这是结构中的数组;它们不能被分配。您应该为每个结构定义一个运算符=(),并在数组上使用memcpy,或者逐个元素在循环中复制它们。

(如果您希望获得对全局变量的引用):

我不确定这是否正确(以及问题所在),但我认为除了函数原型之外,数组和指针(指向数组1.element)并不完全相同。指向数组的指针和指向1的指针之间存在差异。数组的元素)

可能需要获取数组的地址:

*pt = &(pglobal->table);
无论如何,最好不要获取整个数组的地址,而是获取第一个元素的地址,这样得到的指针就可以直接用作记录数组(无需取消引用)

(如果需要表格的副本):

数组不能在C90中就地复制,当然您必须提供目标内存。然后,您将定义一个函数get table,如下所示:

void gettable (recordtype * const targetArr)
{
    size_t i = 0;
    for (; i < MAX; i++) targetArr[i] = pglobal->table[i];
    return;
}
当涉及函数参数时,数组由refence作为指向第一个元素的指针提供。您可以再次请求一个指向整个数组的指针,并在gettable中取消对它的引用。但你总是要从元素上复制

您可以使用memcopy作为1-liner来完成这项工作。现代编译器应该在AFAIK中生成同样有效的代码

recordtype* gettable (size_t* puLength)
{     
    *puLength = MAX;     
    return &(pglobal->table[0]);        
}
void gettable (recordtype * const targetArr)
{
    size_t i = 0;
    for (; i < MAX; i++) targetArr[i] = pglobal->table[i];
    return;
}
void gettable(recordtype[] targetArr);