首页 > 解决方案 > “结构被复制,数组被别名”这是什么意思?

问题描述

我在读克莱门斯,本。21st Century C: C Tips from the New School 和我被一句话“结构复制,数组获得别名”阻止了,我不太明白,这个例子对我来说也不是很清楚。谁能解释一下?

示例代码

    #include <assert.h>

typedef struct{
    int a, b;
    double c, d;
    int *efg;
} demo_s;
int main(){
    demo_s d1 = {.b=1, .c=2, .d=3, .efg=(int[]){4,5,6}};
    demo_s d2 = d1;

    d1.b=14;            
    d1.c=41;
    d1.efg[0]=7;

    assert(d2.a==0);    
    assert(d2.b==1);
    assert(d2.c==2);
    assert(d2.d==3);
    assert(d2.efg[0]==7);
}

克莱门斯,本。21世纪C:新学校的C提示。奥莱利媒体。Kindle版。

#include <assert.h>

int main(){
    int abc[] = {0, 1, 2};
    int *copy = abc;

    copy[0] = 3;
assert(abc[0]==3); 
}

克莱门斯,本。21世纪C:新学校的C提示。奥莱利媒体。Kindle版。

标签: carraysstruct

解决方案


这个任务:

demo_s d2 = d1;

在第一个示例中,实际上复制了结构的内容。所以这意味着如果原始结构更改了某些值,这将不会反映在副本中(它们不共享相同的引用),反之亦然。

另一方面,对于数组,赋值:

int *copy = abc;

仅分配要复制的数组的引用,但不复制数组的内容。因此,这意味着如果原始数组更改了某些值,则复制的引用(因为它们引用相同的引用)也将反映更改(反之亦然)。从某种意义上说(另请参阅此答案下方的评论)这copy是另一个名称,因为abc它们指的是同一个对象,如果您愿意,它是一个别名,因此解释

示例中的断言说明了 C 语言的这一特性。

请注意,在第一个结构示例中,该efg字段是指向数组的指针,它也被复制但它复制了引用,因此这反映了对原始结构的字段所做的更改。


推荐阅读