我编写了以下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),它给了我一个分段错误.
无法搞清楚.有人可以向我解释一下吗?
函数代码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)
它应该更好.