我在这里使用字符串时会出现分段错误吗?

use*_*152 1 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);
}
Run Code Online (Sandbox Code Playgroud)

当我把一个字符串作为时它工作正常replace("Move a mountain", "card", 0,4),但是当我使用指针数组声明一个字符串char *list[1]={"Move a mountain"}并将其传递给函数时replace(list[0], "card",0,4),它给了我一个分段错误.

无法搞清楚.有人可以向我解释一下吗?

Ste*_*ner 7

函数代码replace看起来很好,但是你调用它的所有方法都会引入未定义的行为:

首先,使用replace("Move a mountain", "card", 0,4),您将传递一个字符串文字作为参数str1,replace然后在其中进行修改.修改字符串文字是未定义的行为,如果它"有效",那只是运气(实际上比运气好运气).

第二个char *list[1]={"Move a mountain"}是类似的,但引入了另一个问题:char*list是一个指针数组,并初始化list[0]为指向字符串文字""Move a mountain".因此list[0],由于修改字符串文字,传递将再次导致UB.但是然后你传递list[1],这是超出范围,因此引入了未定义的行为.同样,一切都可能发生,segfaulting只是一种可能性.

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

它应该更好.