我是C语言的初学者,有以下代码。
#include <stdio.h>
#include<string.h>
int main(void){
char *s1="abcd";
char s2[30]="abcd";
if(strcmp(s1,s2)){
printf("sirurile sunt identice\n");
}else printf("sirurile sunt diferite\n");
strcpy(s2,s1);
printf("%s\n",s1);
strcpy(s1,s2);
printf("%s\n",s2);
return 0;
}
我试图理解为什么输出不考虑第二次打印,只显示第一个'abcd'。输出是:锡鲁里莱·苏特·迪费尔利特
我期望abcd打印两次,因为字符串似乎是复制一个在另一个
2条答案
按热度按时间6yt4nkrj1#
字符串通常存储在进程的只读数据部分。在你的程序中,s1指向那个只读区域。这就是为什么你在尝试用strcpy改变它时会遇到seg错误的原因。
有关详细说明,请阅读此帖子String literals: Where do they go?
lkaoscv72#
表示你有指向字符串字面量的指针。你不能修改。That is UB since C89 and K&R.
当你把它改成
s1
将是字符串长度的字符数组,您可以修改它而不会出现任何错误。基于您的代码修改的代码段:
输出:
你可以找到上面代码here的输出