[英]Is the C `=` operator copying memory when applied between structs?
考虑以下示例:
typedef struct {
int x;
int y;
...
} ReallyBigItem;
ReallyBigItem* array = (ReallyBigItem*) malloc(sizeof(ReallyBigItem) * 8);
ReallyBigItem* item = (ReallyBigItem*) malloc(sizeof(ReallyBigItem));
item->x = 0;
item->y = 1;
array[0] = *item;
ReallyBigItem* array = (ReallyBigItem*) malloc(sizeof(ReallyBigItem) * 8);
我正在为适合8个ReallyBigItem
结构的数组分配空间。
ReallyBigItem* item = (ReallyBigItem*) malloc(sizeof(ReallyBigItem));
我正在为ReallyBigItem
分配空间并将其内存地址存储在item
。
array[0] = *item;
现在,我将数组的第一个元素设置为该项目。
我的问题是:
=
运算符是否实际上在已经分配的内存上进行复制 ? 那么项目struct在内存中存在两次 ?
是的,您正在这里复制整个struct
。 您可以创建一个ReallyBigItem **array
然后分配item
(而非*item
)以仅复制指针。
因此项目struct在内存中存在两次?
该item
指向的struct
的内容在相关分配后存在两次,是的。
说明:
此表达式的两个操作数
array[0] = *item;
评估struct
。
=
是为struts
定义的。
因此,上面的表达式从右struct
向左复制数据(存储的内容,而不是您所说的“ 内存 ”)。
如果考虑到*item
实际上与item[0]
相同,这可能会更加明显,因此上述表达式等效于:
array[0] = item[0];
是的,它确实。 您复制整个结构。
证明: http : //ideone.com/cXZqNP
码:
#include <stdio.h>
typedef struct {
int x;
int y;
} ReallyBigItem;
int main(void) {
ReallyBigItem* array = (ReallyBigItem*) malloc(sizeof(ReallyBigItem) * 8);
ReallyBigItem* item = (ReallyBigItem*) malloc(sizeof(ReallyBigItem));
item->x = 0;
item->y = 1;
array[0] = *item;
printf("%d - %d\n", array[0].y, item->y);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.