我理解C标准禁止将数组用作(可修改的)左值,即在赋值的左侧:
int lhs[4], rhs[4] = {0, 1, 2, 3};
lhs = rhs; /* illegal! */
现在,我一直想知道为什么会这样。我可以看到上面的语句(以及写入数组的任何其他赋值)被定义为等同于
memcpy((void *) lhs, (void *) rhs, sizeof(lhs));
并承担确保rhs
对用户来说足够大的负担,但事实并非如此。
然而,一个非常相似的例子 完全正常工作:
struct { int a[4]; } lhs, rhs = {{0, 1, 2, 3, 4}};
lhs = rhs;
只需将数组包装在结构中,我们就可以完全获得上述行为,即赋值lhs = rhs
等同于:
memcpy((void *) &lhs, (void *) &rhs, sizeof(lhs));
这个(我觉得)不一致的理由是什么?允许将数组赋值解释为memcpy
s?
答案 0 :(得分:2)
C应该是低级语言,不会隐藏简单语法背后的潜在内存或耗时任务。一个操作员生成一个汇编指令;对于更复杂的东西调用函数。在C早期,你既不能分配结构,也不能在函数之间传递它们(你传递一个指针)。
修改强>
结构是一个值。它的大小是静态的,在编译时是已知的。数组是多个值,大多数数组是动态分配/重新分配的。它们的大小在编译时是不可知的,因此编译器不知道要分配和复制多少内存。
int *a, *b;
a = malloc(/* value based on e.g. user input */);
b = a; /* compile this into what? */
为了使它起作用,C必须在内部将数组的大小与指针一起存储或与指向的数据一起存储。这个决定留给了程序员。