This question already has answers here:
Why do I get a segmentation fault when writing to a string initialized with “char *s” but not “char s[]”?
                                
                                    (17个答案)
                                
                        
                                3年前关闭。
            
                    
我正在尝试实现自己的strcpy函数,下面是代码:

#include<stdio.h>
#include <stdlib.h>



void Strcat(char *p1,char*p2)
{
    while(*p1!='\0'){p1++;}; //this increments the pointer till the end of the array (it then points to the last element which is '\0')

    while(*p2!='\0'){*p1++=*p2++;};
}
int main()
{
    char txt1[]="hell";
    char txt2[]="o!";

    printf("before :%s\n",txt1);
    Strcat(txt1,txt2);
    printf("after :%s\n",txt1);

}


一切正常。

但是,当我改变

char txt1[]="hell";
char txt2[]="o!";




char *txt1="hell";
char *txt2="o!";


我遇到细分错误,

这是为什么 ?

它们(两个初始化方法)不是等效的吗?
“ txt1”和“ txt2”是否都像指向char数组的第一个元素的指针一样?

最佳答案

字符串文字是不可修改的,尝试修改它们会调用未定义的行为。

char txt1[]="hell";是一个字符数组,因此可以修改其内容。

char *txt1="hell";是指向字符串文字的指针,因此您不得修改所指向的内容。

10-05 21:16
查看更多