将结构复制到相同类型结构的数组中
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;
请注意,这仅适用于 struct
s,不适用于数组。 (它也适用于包含数组的 struct
s。)
在按值复制包含指针的 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;
}
我正在尝试将结构复制到相同类型结构的数组中。
我的结构是
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;
请注意,这仅适用于 struct
s,不适用于数组。 (它也适用于包含数组的 struct
s。)
在按值复制包含指针的 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;
}