C:赋值运算符是否深拷贝?

blu*_*ote 0 c struct assignment-operator

对于标量值,赋值运算符似乎将右侧的值复制到左侧。这对复合数据类型有何作用?例如,如果我有一个嵌套结构

struct inner {
    int b;
};

struct outer {
   struct inner a;
};

int main() {
   struct outer s1 = { .a = {.b=1}};   
   struct outer s2 = s1;
}
Run Code Online (Sandbox Code Playgroud)
  • 赋值是否递归地深度复制值?
  • 将结构传递给函数时会发生同样的情况吗?

通过实验似乎确实如此,但是有人可以指出行为的规范吗?

unw*_*ind 5

没有“递归”;它复制值的所有(值)位。指针当然不会被神奇地跟随,赋值运算符不知道如何复制指向的数据。

你可以想到

a = b;
Run Code Online (Sandbox Code Playgroud)

作为简写

memcpy(&a, &b, sizeof a);
Run Code Online (Sandbox Code Playgroud)

sizeof当然是误导,因为我们知道双方的类型相同,但我认为没有__typeof__帮助。

C11 规范草案说(在 6.5.16.1 简单赋值,第 2 段):

在简单赋值 ( =) 中,右操作数的值被转换为赋值表达式的类型,并替换左操作数指定的对象中存储的值。