2

声明*p++ = *source++; 在下面的第一个程序中不会导致任何错误,但会导致错误ISO C++ 禁止在编译时转换为在第二个程序中用作左值的非引用类型。为什么会发生这种情况?

  • 第一个程序

    #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;
    }
    
4

3 回答 3

2

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

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

char *p = destination;
putchar('\n'); 
char *src = source;
while(*src != '\0') 
{
    *p++ = *src++; 
}
*p = '\0';
puts(destination);
return 0;
于 2012-12-02T12:38:54.503 回答
1

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

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

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

就这样

于 2012-12-02T12:40:05.173 回答
0

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

于 2012-12-02T12:37:35.480 回答