为什么C不能直接分配数组但是可以在结构中分配数组?

won*_*ter 5 c

该代码不起作用:

int main() {
    int arr1[10];
    int arr2[10];

    arr2 = arr1;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但这有效:

struct foo {
    int arr[10];
};

int main() {
    struct foo f1;
    struct foo f2;

    f2 = f1;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是在我看来,它们做同样的事情:只需将一个数组复制到另一个数组。

Eri*_*hil 5

C 的历史发展的一个结果是你不能直接引用数组。

arr2 = arr1;,arr2和 中arr1命名一个数组。但是在 C 中有一条规则,即当在表达式中使用数组时,它会自动转换为指向其第一个元素的指针,但有某些例外。1 C 当然能够将一个数组复制到另一个数组,就像memcpy(arr2, arr1, sizeof arr2);. 问题是根本无法在赋值语句中引用数组。

这种数组的自动转换旨在为访问数组元素和以最初开发 C 语言时使用的方式处理数组提供便利。没有预料到需要将整个数组作为一个完整的对象来引用,并且语言中没有为此内置任何内容。(即使在今天,也没有必要——除了复制它之外,我们希望对作为单个对象的数组执行的操作很少。)

早期的 C 实现也不允许您通过赋值复制结构。C 是一种相当基本的语言,只提供简单的操作,复制整个结构是一件很奇特的事情。后来,添加了复制结构的功能。

f2 = f1;,f2f1引用结构,并且没有关于它们被自动转换为任何东西的规则,就像数组一样。

所以问题只是能够表达所需的操作。

脚注

1规则在 C 2018 6.3.2.1 3 中,例外情况是当数组是sizeof或 一元的操作数或者&是用于初始化数组的字符串文字时(如char x[] = "abc";"abc"是字符串文字,它是一个数组)。