我正在尝试将结构复制到相同类型结构的数组中。
我的结构是
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?
答案 0 :(得分:1)
memcpy(inodetable.inodes[0], &rootinode, sizeof rootinode)
会奏效。 inodetable
是struct
类型,您无法将其编入索引。
另一个选项是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);