调试了几个小时,出现了细分错误。找不到问题

时间:2019-11-10 18:38:52

标签: c pointers segmentation-fault coredump

有些代码似乎可以正常工作,但是每次运行代码时,突然我开始遇到分段错误。

希望新鲜的眼睛可以帮助我找到问题所在。

它运行这一行(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,分段错误。 /lib64/libc.so.6中__strcmp_sse42()中的0x00007ffff7b4c196

1 个答案:

答案 0 :(得分:3)

getSum中的索引需要一些修正。输入list是[0-程序,1-“和”,2-“ 3”和3-“ 4”]。并且n = 4。但是,总和从3变为4(包括4)。列表中没有任何元素#4触发了SEGV。

请考虑将循环限制为i<n,而不是i<=n

明智地使用样式,将i ++移至“ for”语句,声明变量并将其设置在同一行,然后考虑使用索引而不是指针样式引用(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)));的打印输出。它复制了第二个参数,这不是您想要的。