Программа получила сигнал SIGSEGV, Ошибка сегментации. C ++ - PullRequest
0 голосов
/ 19 апреля 2020

Я получаю эту ошибку (* s = * end; line) во время отладки, при попытке перевернуть строку с помощью указателей. Я использую Windows 10 ОС, кодовые блоки IDE и GDB отладчик.

#include <stdio.h>
#include <string.h>
#include <limits.h>

void myreverse(char* s);

int main()
{
    char* s1 = "1234";
    myreverse(s1);
    printf("%s", s1);
    return 0;
}

void myreverse(char* s) {
    char tmp;
    char* end = s + strlen(s) - 1;

    for(; s < end; s++, end--) {
        tmp = *s;
        *s = *end;
        *end = tmp;
    }
}

1 Ответ

1 голос
/ 19 апреля 2020

Вы должны изменить s1 на char s1[] = "1234";, так как вы вносите изменения в строку.

Тогда в вашей функции myreverse() вы никогда не будете использовать переменную tmp, которая делает ваш блок подкачки ошибка.

Исправлено:

#include <cstdio>   // use the C++ versions of the header files
#include <cstring>

void myreverse(char* s) {
    char tmp;
    char* end = s + std::strlen(s) - 1;

    for(; s < end; s++, end--) {
        // swap
        tmp = *s;
        *s = *end;
        *end = tmp;   // use tmp
    }
}

int main() {
    char s1[] = "1234";
    myreverse(s1);
    printf("%s", s1);
}

Обратите внимание, что 3 строки в блоке подкачки можно заменить на std::swap(*s, *end);, а также что myreverse() может быть полностью заменено на std::reverse(std::begin(s1), std::end(s1));.

...