簡體   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