首页 >后端开发 >C++ >为什么我不能直接为数组赋值,但可以在 C/C 中的结构体中赋值?

为什么我不能直接为数组赋值,但可以在 C/C 中的结构体中赋值?

Susan Sarandon
Susan Sarandon原创
2024-12-19 22:49:09471浏览

Why Can't I Assign Arrays Directly, But I Can Within Structs in C/C  ?

为什么仅在结构体中支持数组成员赋值

与一般数组不同,结构中定义的数组享受成员赋值。虽然不允许将一个数组分配给另一个数组 (__

num1 = num2;//
),但它在结构中变得可行 (
struct1 = struct2;//&lt ;/pre>__),如下图:<pre class="brush:php;toolbar:false">int num1[3] = {1,2,3};
int num2[3];
num2 = num1; // "error: invalid array assignment"

struct myStruct { int num[3]; };
struct myStruct struct1 = {{1,2,3}};
struct myStruct struct2;
struct2 = struct1;

历史和哲学原理

这种差异源于 C 的演变。在早期迭代中,数组本质上是没有大小信息的指针。这阻碍了他们的分配,因为编译器缺乏必要的数据。然而,结构内的数组受益于特殊的处理,从封闭的结构继承其类型和大小信息。因此,它们可以在结构体的上下文中按成员进行分配,而不受一般约束的影响。

这种做法被延续到现代 C 和 C 中,这是一个解决分配开放数组的实现挑战的怪癖。引入通用数组分配会带来歧义和兼容性问题。因此,限制得以保留,并鼓励程序员使用 memcpy 进行显式数组复制。

异常

函数参数已成为数组成员可以的另一种设置分配的。考虑以下代码:

typedef int vec[3];

void f(vec a, vec b) {
    a = b; // pointer assignment
}

虽然 a 是指针参数,但赋值有效地执行了按元素复制,尽管位于结构之外。此异常本质上是一种增强功能,允许在函数调用中使用值语义。

以上是为什么我不能直接为数组赋值,但可以在 C/C 中的结构体中赋值?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn