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

时间:2015-03-22 18:58:04

标签: c arrays struct memcpy

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

我的结构是

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?

4 个答案:

答案 0 :(得分:1)

memcpy(inodetable.inodes[0], &rootinode, sizeof rootinode)会奏效。 inodetablestruct类型,您无法将其编入索引。

另一个选项是memcpy(&inodetable, &rootinode, sizeof rootinode),但明确命名该成员并不那么令人困惑。

但是,您无需使用memcpy()来复制struct。一个简单的任务将起作用:

inodetable.inodes[0] = rootinode;

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

在按值(通过struct或普通分配)复制包含指针的memcpy()时,您还需要小心。只会复制指针本身 - 而不是它们指向的指针。副本中的指针最终指向与复制的struct

中相同的位置

答案 1 :(得分:0)

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

在以下代码中,我尝试将bestSol struct复制到Solutions[iScenario]中以用于每个场景。它无法正常工作,Solutions函数中的generateAplan仅适用于最后一个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);
     }

答案 2 :(得分:0)

其他答案有误。

要执行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;
}

答案 3 :(得分:-1)

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