为什么这个语句会在C中的一个函数中导致错误,而在另一个函数中不会导致错误?
语句*p++=*source++在下面的第一个程序中不会导致任何错误,但是会导致在编译时,ISO C++禁止在第二个程序中使用非引用类型作为LValk。为什么会发生这种情况为什么这个语句会在C中的一个函数中导致错误,而在另一个函数中不会导致错误?,c,compiler-errors,iso,C,Compiler Errors,Iso,语句*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]
,因此函数有一个可以递增的指针。