C语言 为什么第二个指纹什么都没有

xcitsw88  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(92)

我是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打印两次,因为字符串似乎是复制一个在另一个

6yt4nkrj

6yt4nkrj1#

字符串通常存储在进程的只读数据部分。在你的程序中,s1指向那个只读区域。这就是为什么你在尝试用strcpy改变它时会遇到seg错误的原因。
有关详细说明,请阅读此帖子String literals: Where do they go?

lkaoscv7

lkaoscv72#

char * s1 = "abcd";

表示你有指向字符串字面量的指针。你不能修改。That is UB since C89 and K&R.
当你把它改成

char s1[]="abcd";

s1将是字符串长度的字符数组,您可以修改它而不会出现任何错误。
基于您的代码修改的代码段:

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

输出:

sirurile sunt diferite
abcd
abcd

你可以找到上面代码here的输出

相关问题