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

为什么这个语句会在C中的一个函数中导致错误,而在另一个函数中不会导致错误?,c,compiler-errors,iso,C,Compiler Errors,Iso,语句*p++=*source++

语句*p++=*source++
  • 第一个节目

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

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

      发生这种情况的原因是第一个程序递增指针,而在第二个程序中对数组应用
      ++
      运算符。虽然数组的行为通常类似于指针,但它们不是指针。数组支持指针算术,但不支持将其视为左值的指针运算符(即尝试修改其指向的位置)

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

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

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

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

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

      这就是第二个例子,
      source
      是一个数组。所以
      source++
      是非法的。在第一种情况下,传递给函数的是
      &source[0]
      ,因此函数有一个可以递增的指针。