【问题标题】:Problems with a structure copy结构副本的问题
【发布时间】:2012-09-05 16:13:32
【问题描述】:

当我尝试将结构从一个位置复制到另一个位置时,我在使用标准 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:'=':左操作数必须是左值。看起来这应该表现为正常的复制操作,并且在事实上,如果我对一个更基本的结构执行类似的操作,我不会得到错误。例如,如果我复制一个只包含两个整数的结构。

有人对为什么这个操作似乎不正确有一个可靠的解释吗?

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      我不确定这是否正确(以及问题),但我认为除了函数原型之外,数组和指针(指向数组 1. 元素)并不完全相同。而且指向数组的指针和指向数组的1.元素的指针是有区别的)

      也许取数组的地址:

      *pt = &(pglobal->table);
      

      无论如何,最好不要获取整个数组的地址,而是获取第一个元素的地址,这样生成的指针可以直接用作记录数组(无需取消引用)

      recordtype* gettable (size_t* puLength)
      {     
          *puLength = MAX;     
          return &(pglobal->table[0]);        
      }
      

      (如果您想要表格的副本):

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

      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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-09-06
        • 1970-01-01
        • 2019-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多