SIGSEGV в функции C

#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] ), если вы хотите иметь возможность изменять его.