#c #segmentation-fault
#c #ошибка сегментации
Вопрос:
У меня проблема с моей функцией.
Когда функция получает такой параметр, все в порядке
char text[50] = "Liquorice gummies macaroon";
но когда я отправляю это, я получаю SIGEGV
char *text = "Liquorice gummies macaroon";
Моя функция:
char *sort(char *text) {
int length = strlen(text);
char *sortString = text;
if (length >1){
shell_sort(sortString, length);
return sortString;
} else if(length == 1) {
return text;
}
}
В функции сортировки я вызываю shell_sort
void shell_sort(char *text, int size) {
int gap, temp, i , j;
for (gap = size/2; gap > 0; gap /= 2) {
for (i = gap; i<size; i ) {
temp = text[i];
for (j = i; j >= gap ;j-=gap) {
if (temp < text[j-gap]) {
text[j] = text[j-gap];
} else {
break;
}
}
text[j] = temp;
}
}
}
Ответ №1:
но когда я отправляю это, я получаю SIGEGV
char *text = «Миндальное печенье с лакричным мармеладом»;
Это потому, что ваша функция shell_sort()
изменяет переданный ей аргумент, а изменение строкового литерала является неопределенным поведением. Вот почему это приводит к segfault (кстати, segfault не гарантируется стандартом C).
Когда функция получает такой параметр, все в порядке
текст символа [50] = «Лакричный мармелад с миндальным печеньем»;
Когда вы инициализируете char
массив из строкового литерала, строковый литерал копируется в массив, который вы можете изменять. Итак, все работает так, как вы ожидали.
Комментарии:
1. Спасибо за ответ. Пожалуйста, есть ли простое решение для устранения этой ошибки?
2. Вы уже знаете решение. Используйте array (
char text[50]
), если вы хотите иметь возможность изменять его.