показывая ошибку сегментации в ранге хакера - PullRequest
0 голосов
/ 04 января 2019

Ниже показана ошибка компилятора (компилятор Hackerrank c). Здесь указатель и начальный адрес блока памяти через malloc, который вводит строку во время выполнения. Может ли кто-нибудь мне помочь?

GDB trace:
Reading symbols from solution...done.
[New LWP 4659]
Core was generated by `solution'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  main () at solution.c:22
22      if ((a[i] != a[j]) && (i >= 0 && j < n)) {
#0  main () at solution.c:22

и мой код

#include <stdio.h>
#include <stdlib.h>
int main() {
    int n, k, i, j, mid;
    char *a;
    int *l;
    a = (char *)malloc((n + 1) * sizeof(char));
    scanf("%d", &n);
    scanf("%d", &k);
    scanf("%s", a);
    mid = (0 + (n - 1)) / 2;
    if (n % 2 == 0) {
        i = mid;
        j = mid + 1;
        l = (int *)malloc((n / 2) * sizeof(int));
    } else {
        i = mid;
        j = mid;
        l = (int *)malloc((n / 2 + 1) * sizeof(int));
    }

    while (k != 0) {
        if ((a[i] != a[j]) && (i >= 0 && j < n)) {
            if (a[i] > a[j]) {
                a[j] = a[i];
                k--;
                i--;
                j++;
            } else {
                a[i] = a[j];
                k--;
                i--;
                j++;
            }
        }
    }
    printf("%s", a);
}

1 Ответ

0 голосов
/ 04 января 2019

В if ((a[i] != a[j]) && (i >= 0 && j < n)) условия меняются местами. Сначала вы индексируете a[i] и a[j], прежде чем проверить, что i и j действительны для индексации a. Это означает, что если i и / или j были недействительными, вы уже использовали их. Попробуйте поменять порядок на if ((i >= 0 && j < n) && (a[i] != a[j])).

edit: Другие очевидные проблемы (теперь, когда выложено больше кода):

  • n используется в качестве аргумента для malloc до его инициализации
  • Вы не ограничиваете длину scanf("%s", a);
  • , если i и / или j выходит за пределы, в то время как k != 0, цикл никогда не завершается
  • если a[i] == a[j] в то время как k != 0, цикл никогда не заканчивается

И обычные щипцы:

  • не приводите возвращаемое значение malloc
  • sizeof(char) всегда 1 по определению, умножать на это бессмысленно
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...