繁体   English   中英

在结构之间应用时,C`=`运算符是否在复制内存?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM