Отладка по часам, ошибка сегментации. Не могу найти проблему - PullRequest
2 голосов
/ 10 ноября 2019

У меня есть код, который, кажется, работает, но внезапно я начал получать ошибку сегментации при каждом запуске кода.

Надеясь на свежую пару глаз, я мог бы найти проблему.

Он запускает эту строку (printf("There are %d arguments excluding (%s)\n", count-1, *(input));) и вылетает после.

Я пытался использовать gdb и перебирать свой код, но не могу найти проблему.

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

int getDiff(char **list[], int n);
int getSum(char *list[], int n);

int main( int count, char *input[] )
{
    int total;

    printf("There are %d arguments excluding (%s)\n", count-1, *(input));

    if(strcmp(*(input+1),"sum") == 0){
                int i;
        for(i = 2; i<=count;){
            printf("%d ", atoi(*(input + 2)));
            i++;
            if(i < count){
                printf("+ ");
            }
        }
        total = getSum(input, count);
    }


    if(strcmp(*(input+1),"diff") == 0){
        total = getDiff(&input, count);
    }

printf(" === %d ====", total);


}

int getDiff(char **list[], int n){


    int i;
    int total = atoi(**(list + 2));
    for (i=3; i<= n;) {
        int convert;
        convert = atoi(**(list + i));
        total = total - convert;
        i++;
    }

return total;

}

int getSum(char *list[], int n){


    int i;
    int total = atoi(*(list + 2));
    for (i=3; i<= n;) {
        int convert;
        convert = atoi(*(list + i));
        total = total + convert;
        i++;
    }

    return total;

}

Должен запускаться и возвращать сумму целых чисел, которые были преобразованы из цифр.

Это то, что говорит GDB

Запрограммировать полученный сигнал SIGSEGV, Ошибка сегментации. 0x00007ffff7b4c196 в __strcmp_sse42 () из /lib64/libc.so.6

1 Ответ

3 голосов
/ 10 ноября 2019

Индексы в getSum нуждаются в некотором исправлении. Вход list - это [0-программа, 1- «сумма», 2- «3» и 3- «4»]. И n = 4. Тем не менее, сумма выглядит от 3 до 4 (в том числе 4). В списке нет элемента № 4, который вызвал бы SEGV.

Рассмотрите возможность ограничения цикла i<n вместо i<=n.

В стиле, переместите i ++ в 'для', объявите переменную и установите их в одной строке и рассмотрите возможность использования индексов вместо ссылок на стиль указателя (list [i], а не * (list + i). Это облегчит чтение кода, и, надеюсь,лучше оценка!

int getSum(char *list[], int n){

    int total = atoi(*(list + 2));
    for (int i=3; i< n; i++) {
        int convert = atoi(*(list + i));
        total = total + convert;
    }

    return total;

}

Наконец, рассмотрите возможность исправления распечатки переменных printf("%d ", atoi(*(input + 2)));. Это дублирует 2-й параметр, а это не то, что вам нужно.

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