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

时间:2016-04-26 16:53:33

标签: c arrays pointers struct dynamic-memory-allocation

考虑这个例子:

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;

现在我将数组的第一个元素设置为该项目。

我的问题是:

=运算符实际复制是否已经分配了内存?因此,项目结构存在于内存中两次

3 个答案:

答案 0 :(得分:1)

是的,您正在复制整个struct。您可以创建ReallyBigItem **array,只需指定item(而非*item)即可复制指针。

答案 1 :(得分:1)

  

那么item struct在内存中存在两次?

struct item的内容,array[0] = *item; 指向相关作业后两次存在,是的。

说明:

此表达式的两个操作数

struct

评估为=

struts定义了struct

因此,上面的表达式将数据(内存的内容,而不是“内存”)从右侧*item复制到左侧。

如果考虑item[0]实际上与array[0] = item[0]; 相同,这可能会更明显,因此上述表达式相当于:

JavascriptExecutor je = (JavascriptExecutor) ieDriver;
String script = "document.getElementsById('form_base_amount_input_hidden')[0].setAttribute('value', '383.852');");
je.executeScript(script);

答案 2 :(得分: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);
}