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