它在处理字符串时出现分段错误?

时间:2019-02-11 08:10:44

标签: 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);
}

当我将字符串放置为replace("Move a mountain", "card", 0,4)时,效果很好,但是当我使用指针数组如char *list[1]={"Move a mountain"}声明字符串并将其传递给函数为replace(list[0], "card",0,4)时,它给了我一个分割错误。

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

1 个答案:

答案 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)

它应该会更好地工作。