将结构复制到相同类型结构的数组中

Copy struct into array of same type of struct

我正在尝试将结构复制到相同类型结构的数组中。

我的结构是

typedef struct{
    int mode; 
    int link_cnt;
    int uid;
    int gid;
    int size;
    int pointers[NUM_INODE_POINTERS];
} inode;

typedef struct{
    inode inodes[MAXFILES+1]; 
} inode_table;

所以 inode_table 是一个 inode 数组。然后我创建了一个实例:

inode_table inodetable;
inode rootinode;

初始化inode并复制到数组中:

inode rootinode={
            .mode=0777, 
            .link_cnt=1,
            .uid=0,
            .gid=0,
            .size=0,
            .pointers={26,0,0,0,0,0,0,0,0,0,0,0,0}
        };

memcpy(inodetable[0], &rootinode, sizeof rootinode);

这不起作用,我在 memcpy 行收到错误:

subscripted value is neither array nor pointer nor vector

如何将 rootinode 结构复制到 inodetable 中?

memcpy(inodetable.inodes[0], &rootinode, sizeof rootinode);

memcpy(inodetable.inodes[0], &rootinode, sizeof rootinode) 会起作用。 inodetable 是一个 struct 类型,你不能对它们进行索引。

另一个选项是 memcpy(&inodetable, &rootinode, sizeof rootinode),但显式命名成员更容易混淆。

但是您不需要使用 memcpy() 来复制 struct。一个简单的作业就可以了:

inodetable.inodes[0] = rootinode;

请注意,这仅适用于 structs,不适用于数组。 (它也适用于包含数组的 structs。)

在按值复制包含指针的 struct 时(通过 memcpy() 或简单赋值),您也需要小心。只有指针本身——而不是它们指向的东西——会被复制。副本中的指针最终指向与复制自 struct.

相同的位置

我希望你详细说明这个问题的答案之一。回复请注意,通过使用 memcpy,仅复制指针。是否可以复制结构中的实际值?

在下面的代码中,我尝试将每个场景的 bestSol 结构复制到 Solutions[iScenario] 中。它不能正常工作,generateAplan 函数中的 Solutions 只有最后一个 iScenario 是正确的。对于前面的,它保留不同的值,如 -17866。

for (iScenario = 1; iScenario <= sce; iScenario++)
    {
    Solution bestSol(curSol);  //struct
    ....
      for (iRetryNumber = 0; iRetryNumber < iNRetries; iRetryNumber++)
         {...
          if (bestSol.m_dCost < dBestObj)
              memcpy(&Solutions[iScenario], &bestSol, sizeof(bestSol));
         }
     if(iScenario == sce)
         generateAplan(Solutions);
     }

其他答案有误。

要执行 memcpy 版本,您需要传递结构地址而不是结构地址。

重点是

memcpy(inodetable.inodes+0, &rootinode, sizeof rootinode);

没有

memcpy(inodetable.inodes[0], &rootinode, sizeof rootinode);

+0 是不必要的,它只是指示其他元素的索引应该去哪里。复制到第 i 个元素:

memcpy(inodetable.inodes+i, &rootinode, sizeof rootinode);

尽管正如其他人通过定义正确指出的那样,C 中结构赋值的语义给出了相同的结果:

inodetable.inodes=rootinode;

MVCE:

#include <stdio.h>
#include <memory.h>

#define NUM_INODE_POINTERS 13
#define MAXFILES 13

typedef struct{
    int mode; 
    int link_cnt;
    int uid;
    int gid;
    int size;
    int pointers[NUM_INODE_POINTERS];
} inode;

typedef struct{
    inode inodes[MAXFILES+1]; 
} inode_table;


int main(){
inode rootinode={
            .mode=0777, 
            .link_cnt=1,
            .uid=0,
            .gid=0,
            .size=0,
            .pointers={26,0,0,0,0,0,0,0,0,0,0,0,0}
   };
    inode_table inodetable;
    inodetable.inodes[0].pointers[0]=11;
    printf("pointer[0]==%d\n",inodetable.inodes[0].pointers[0]);
    memcpy(inodetable.inodes+0, &rootinode, sizeof rootinode);
    printf("pointer[0]==%d\n",inodetable.inodes[0].pointers[0]);
    return 0;
}