【问题标题】:Can someone explain the error?有人可以解释错误吗?
【发布时间】:2013-08-22 05:25:48
【问题描述】:

我在下面有一个 C 程序,在函数 func 中有两个 for 循环。在第一个for 循环中,在增加数组变量a 时没有“需要左值”错误,但是在第二个for 循环中增加数组变量c 时,编译器会给出“需要左值”错误。为什么?

#include<stdio.h>
#include<string.h>
void func(char a[],int n);

int main(int argc,char **argv){

    char * s="Happy ,People\n\n";
    func(s,strlen(s));

    return 0;
}

void func(char a[],int n){
    for(int i=0;i<n;i++){
        printf("%c",*a++);      //This works fine — no lvalue error here
    }

    char c[]="Happy ,People\n\n";
    for(int i=0;i<n;i++){
        printf("%c",*c++); // there is error coming here lvalue Required
    }
}

【问题讨论】:

  • 还有我的一个建议——只需为变量使用有意义的名称,而不是 a[]c[]。无论如何,它是一个约定:)

标签: c arrays compiler-errors


【解决方案1】:

在函数中,c 是一个数组。数组的名称是一个常数。你不能增加或减少它。

与流行的神话相反,数组和指针之间存在差异。

在函数原型中使用[] 会使事情变得混乱,因为它们确实识别指针。你会得到相同的结果:

void func(char *a, int n)
{
    for (int i = 0; i < n; i++)
        printf("%c",*a++);
    char c[] = "Happy, People\n\n";
    for (int i = 0; i < n; i++)
        printf("%c",*c++);
}

【讨论】:

  • +1 我希望我能再次对此投票,只是为了提及神话。我继续看到它(神话)持续存在,我唯一的回应是“指针持有地址;数组地址。”感谢您提及差异。
  • +1 for 而且在函数原型中使用 [] 会造成混淆,因为它们确实识别指针 :)
【解决方案2】:

数组不是左值。数组的名称是指向数组第一个元素的指针常量。您不能修改数组名称指向的地址。在以下代码片段中:

char c[]="Happy ,People\n\n";
for(int i=0;i<n;i++){
printf("%c",*c++); // there is error coming here lvalue Required

当您尝试*c++ 时,您正在尝试修改c 指向的内容。由于c 是指针常量,而不是变量,所以会出现编译错误。

但是,当您将数组传递给函数时,数组“衰减”为指针,而指向数组的指针是按值传递的。该函数接收一个与原始指针具有相同值的新指针,即指向同一位置的新指针,该位置是数组的第一个元素。由于它不是常量,因此可以修改该新指针以指向其他位置。所以*a++ 不会导致编译器错误。

【讨论】:

    猜你喜欢
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    • 2010-12-13
    • 1970-01-01
    相关资源
    最近更新 更多