【问题标题】:Is the C `=` operator copying memory when applied between structs?C `=` 运算符在结构之间应用时是否复制内存?
【发布时间】:2016-08-20 15:33:52
【问题描述】:

考虑这个例子:

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;

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

我的问题是:

= 操作符实际上是 复制 已分配的内存吗?那么item结构在内存中存在两次

【问题讨论】:

  • 是的,就像int a = b 一样,b 的值会在内存中存在两次。
  • 不要将malloc和朋友的结果投射到C中。

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


【解决方案1】:

所以item结构体在内存中存在两次?

item 指向的struct 的内容在相关赋值之后存在两次,是的。

解释:

这个表达式的两个操作数

array[0] = *item;

评估为struct

= 是为 struts 定义的。

所以上面的表达式从右边的struct 向左边复制数据(内存的内容,而不是“内存”)。

如果考虑到*item 实际上与item[0] 相同,这可能会更明显,所以上面的表达式等价于:

array[0] = item[0];

【讨论】:

  • 谢谢,现在更有意义了。我对结构数组(Item*)而不是指向结构(Item**)的指针更好奇,这在通过=设置整个结构时似乎确实浪费了内存@
  • @ᴘᴀɴᴀʏɪᴏᴛɪs:请注意,您的代码没有定义任何数组,而只有两个指针 arrayitem,其中一个分配给八个 struct 的内存,另一个分配给一个struct。它们都属于同一类型:ReallyBigItem* 是指向 ReallyBigItem 的指针。
  • ReallyBigItem** ppa; 会将ppa 定义为指向ReallyBigItem 的指针。
  • ReallyBigItem[42] a; 将定义一个数组 a,包含 42 个 ReallyBigItem 类型的元素。 :-)
【解决方案2】:

是的,您在此处复制整个struct。您可以创建一个ReallyBigItem **array 并分配item(不是*item)来复制指针。

【讨论】:

    【解决方案3】:

    是的,确实如此。你复制整个结构。

    这是证明: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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-17
      • 2014-01-30
      • 2021-11-05
      • 2015-06-15
      • 1970-01-01
      相关资源
      最近更新 更多