C 当它与字符串一起工作时,我在这里遇到了分段错误?

C 当它与字符串一起工作时,我在这里遇到了分段错误?,c,pointers,C,Pointers,我编写了以下replace函数,它替换大字符串中的子字符串,如下所示: void replace(char *str1, char *str2, int start, int end) { int i,j=0; for(i=start; i<end; i++, j++) *(str1+i)=*(str2+j); } 当我将字符串作为replaceMove a mountain,card,0,4放置时,它可以正常工作,但当我使用指针数组(如char*list

我编写了以下replace函数,它替换大字符串中的子字符串,如下所示:

void replace(char *str1, char *str2, int start, int end)
{
    int i,j=0;
    for(i=start; i<end; i++, j++)
        *(str1+i)=*(str2+j);
}
当我将字符串作为replaceMove a mountain,card,0,4放置时,它可以正常工作,但当我使用指针数组(如char*list[1]={Move a mountain})声明字符串并将其作为replacelist[0],card,0,4传递给函数时,它会给我一个分段错误

我想不出来。有人能给我解释一下吗?

函数替换的代码看起来不错,但您称它的所有方式都引入了未定义的行为:

首先,使用replaceMove a mountain,card,0,4,传递一个字符串文本作为str1的参数,该参数在replace then中修改。修改字符串文字是一种未定义的行为,如果它起作用,那就是运气——事实上,运气比运气更坏

第二个char*list[1]={移动一座山}类似,但引入了另一个问题:char*list是一个指针数组,您可以初始化list[0]以指向字符串文字移动一座山。因此,由于修改字符串文字,传递列表[0]将再次导致UB。但随后您将传递列表[1],它超出了范围,因此引入了未定义的行为。同样,一切都有可能发生,断层只是其中一种可能性

char list[] = "Move a mountain"; // copies string literal into a new and modifiable array 
replace(list, "card",0,4)
而且它应该工作得更好。

函数替换的代码看起来不错,但您调用它的所有方式都会引入未定义的行为:

首先,使用replaceMove a mountain,card,0,4,传递一个字符串文本作为str1的参数,该参数在replace then中修改。修改字符串文字是一种未定义的行为,如果它起作用,那就是运气——事实上,运气比运气更坏

第二个char*list[1]={移动一座山}类似,但引入了另一个问题:char*list是一个指针数组,您可以初始化list[0]以指向字符串文字移动一座山。因此,由于修改字符串文字,传递列表[0]将再次导致UB。但随后您将传递列表[1],它超出了范围,因此引入了未定义的行为。同样,一切都有可能发生,断层只是其中一种可能性

char list[] = "Move a mountain"; // copies string literal into a new and modifiable array 
replace(list, "card",0,4)

C语言中的文字字符串实际上是只读字符数组。试图修改这样一个数组的内容会导致错误。这就是为什么所有指向文本字符串的指针都应该是const char*。在一个不相关的注释中,表达式*str1+i完全等于str1[i]。后者通常更容易阅读和理解,而且写起来也更短。对于所有数组和指针来说,这个等价性是正确的。我只是想知道C++编译器为什么警告将字符串文本分配给char *,而C编译器却不这么做。如果C编译器也发出警告,OP的问题就不会出现。@C中的一个文本字符串是字符数组。在C++中,文字字符串是conchchar数组。C中的数组无法修改,因此它实际上是只读的,但它仍然不是常量字符数组。这只是C和C++不同的一种方式,以及为什么这里许多人不喜欢C/C++的术语或者使用C和C++标签来提问。试图修改这样一个数组的内容会导致错误。这就是为什么所有指向文本字符串的指针都应该是const char*。在一个不相关的注释中,表达式*str1+i完全等于str1[i]。后者通常更容易阅读和理解,而且写起来也更短。对于所有数组和指针来说,这个等价性是正确的。我只是想知道C++编译器为什么警告将字符串文本分配给char *,而C编译器却不这么做。如果C编译器也发出警告,OP的问题就不会出现。@C中的一个文本字符串是字符数组。在C++中,文字字符串是conchchar数组。C中的数组无法修改,因此它实际上是只读的,但它仍然不是常量字符数组。这只是C和C++不同的一个方法,为什么这里很多人不喜欢C/C++的术语,或者使用C和C++标签来提问。