为什么这个语句在一个函数中导​​致错误而在另一个函数中不导致错误?

时间:2012-12-02 12:33:44

标签: c compiler-errors iso

语句 * p ++ = * source ++; 在以下第一个程序中不会导致任何错误,但会导致错误 ISO C ++禁止转换为非引用类型用作左值< / em>在编译时的第二个程序中。为什么会这样?

  • 第一个程序

    #include 
    
    char *my_strcpy(char *destination, char *source)
    {
        char *p = destination;
        while (*source != '\0')
        {
            *p++ = *source++;
        }
        *p = '\0'; 
        return destination;
    }
    
    int main()
    {
        char source[] = "A string to be used for demonstration purposes";
        char destination[80];   
        my_strcpy(destination, source);
        puts(destination);
        return 0;
    }
    
  • 第二个程序

    #include 
    
    char source[] = "A string to be used for demonstration purposes";
    char destination[80];
    
    int main()
    {
        char *p = destination;
        putchar('\n'); 
        while(*source != '\0') 
        {
            *p++ = *source++; 
        }
        *p = '\0';
        puts(destination);
        return 0;
    }
    

3 个答案:

答案 0 :(得分:2)

这是因为您的第一个程序递增指针,而在第二个程序中,您将++运算符应用于数组。虽然数组通常表现得像指针,但它们不是指针。数组支持指针算术,但它们不支持将它们视为lvalue的指针运算符(即尝试修改它们指向的位置)。

修复问题很简单 - 只需创建一个指向数组的指针,并在循环中使用该指针,如下所示:

char *p = destination;
putchar('\n'); 
char *src = source;
while(*src != '\0') 
{
    *p++ = *src++; 
}
*p = '\0';
puts(destination);
return 0;

答案 1 :(得分:1)

在第一个程序中source通过将其传递给my_strcpy而转换为指向char的指针,因此您可以将其递增。另一方面,在第二个程序中,source仍然是一个数组,并且您无法递增数组。

顺便说一句,我认为C库以非常简短的方式实现strcpy,如下所示:

while((*dst++ = *src++));

这就是全部

答案 2 :(得分:0)

您无法修改源代码,您已创建一个指向它的本地指针,就像使用p作为目标一样。 source是一个静态定义的数组,因此您只能更改其内容,而不能更改其地址。