我编写了以下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);
}
当我将字符串放置为replace("Move a mountain", "card", 0,4)
时,效果很好,但是当我使用指针数组如char *list[1]={"Move a mountain"}
声明字符串并将其传递给函数为replace(list[0], "card",0,4)
时,它给了我一个分割错误。
无法弄清楚。有人可以向我解释一下吗?
答案 0 :(得分: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]
,它超出了范围,因此引入了未定义的行为。再说一次,一切都会发生,段隔离就是这样一种可能性。
写
char list[] = "Move a mountain"; // copies string literal into a new and modifiable array
replace(list, "card",0,4)
它应该会更好地工作。