C 程序无法编译:它显示"lvalue"错误


#include <stdio.h>
int main()
{
int ary[2][3];
foo(ary);
}
void foo(int (*ary)[3])
{
int i = 10, j = 2, k;
ary[0] = &i;
ary[1] = &j;
for (k = 0;k < 2; k++)
printf("%dn", *ary[k]);
}

我尝试了许多不同的编译器,但我不明白为什么这不会编译。

您正在分配给具有数组类型的表达式。

foo内部ary是一个类型为"指向三个ints 数组的指针"的变量。

当你分配给它时,你试图将一个类型为"指向int的指针"的变量分配给一个类型为"三个int数组"的变量。

这是无效的,因为数组不是左值 (6.3.2.1p3(:

除非它是 sizeof 运算符、_Alignof运算符或一&元运算符的操作数,或者是用于初始化数组的字符串文本,否则类型为"arrayof type"的表达式将转换为类型为"指针指向类型"的表达式,该表达式指向数组对象的初始元素,而不是左值。如果数组对象具有register存储类,则行为未定义。

#include <stdio.h>
void foo(int (*ary)[3]);

int main()
{
int ary[2][3];
int (*x)[3] = &ary[0];
foo(&ary[0]);
}
void foo(int (*ary)[3])
{
int i = 10, j = 2, k;
*ary[0] = i;
*ary[1] = j;
for (k = 0;k < 2; k++)
printf("%dn", *ary[k]);
}

在 C 语言数组中,结构和联合总是随着引用而传递。C 语言不严格检查引用类型,也支持隐式强制转换。

void foo(int (*ary([3]( 这是将函数作为引用传递给函数(回调函数(的语法。 但是您尝试为由 C 隐式强制转换的函数分配一个值并不重要,您传递数组引用。 这就是为什么它显示左值错误。

LValue 意味着如果你使用赋值运算符 (=( 分配一些值,左侧必须是一个变量,但在你的情况下它是一个回调引用。

希望它有帮助。

最新更新