Я получаю ошибку сегментации здесь, пока она работает со строками? - PullRequest
0 голосов
/ 11 февраля 2019

Я написал следующую функцию 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 голосов
/ 11 февраля 2019

Код функции 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)

, и это должно работать лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...