for循环中的分段错误

时间:2016-03-04 21:49:27

标签: c pointers segmentation-fault

我的代码出现了分段错误,在我的生活中,我无法找出原因。我对指针很新,所以它可能是显而易见的。该代码应该从stdin获取两行整数并以交替方式打印出来。我还没有完成打印出交替数字的代码的最后部分。

    int main(){
        char *str1 = NULL;
        char *str2 = NULL;
        size_t sz = 0;
        int i;
        int x;
        char *rp1 = NULL;
        char *rp2 = NULL;
        getline(&str1, &sz, stdin);
        getline(&str2, &sz, stdin);
        char *result1;
        result1 = malloc(sizeof(*str1));
        char *result2; 
        result2 = malloc(sizeof(*str2));
        for(i = 0; (x = sscanf(str1, "%s ", &result1[i])) > 0; i++){
            if(x == EOF){
               return 0;
            }
            if(!isdigit(result1[i])){
               fprintf(stderr, "Error: invalid non-integer input\n");
               return 1;
            }
        }
        rp1 = malloc(i);
        rp1 = result1;
        for(i = 0; sscanf(str2, "%s ", &result2[i]) > 0; i++){
            if(!isdigit(result2[i])){
            fprintf(stderr, "Error: invalid non-integer input\n");
                return 1;
            }
        }
        rp2 = malloc(i);
        rp2 = result2;
        return 0;
  }

当我运行gdb时,它说我在第25行遇到了分段错误,这是循环的第一个。

编辑:所以我修复了for循环之前malloc函数中的一个问题,但我仍然遇到了分段错误。

2 个答案:

答案 0 :(得分:1)

问题1:

sizeof(*str[1-2])sizeof(char)相同。您为两个结果缓冲区分配了一个char,这显然是不够的。使用strlen(str[1-2]) + 1这将为您提供一个缓冲区,该缓冲区等于字符串中的字符数,再加上一个用于空终止符的缓冲区。

问题2:

getline()分配一个缓冲区,在你完成它之后你需要free(),你没有这样做,这实际上是一个内存泄漏。这不是你问题的原因,但值得一提。所有malloc()内存都是如此。

答案 1 :(得分:1)

此代码存在很多问题。其他人已经指出malloc问题,但总的来说它不必要地复杂化。可以消除所有中间变量,并直接访问str1str2

为简化起见,我将把它减少到只有一个输入字符串str。如果你想要两个,那么代码应该被放入一个函数而不是复制。

for + sscanf循环似乎试图遍历str并检查它是否只包含数字。通过遍历字符数组直到你在末尾点击空字符来实现这一点要好得多。

for(int i = 0; str[i] != '\0'; i++){
    ...do something with str[i]...
}

因此,检查输入的每个字符是否为数字......

for(int i = 0; str[i] != '\0'; i++){
    if(!isdigit(str[i])){
        fprintf(stderr, "Error: invalid non-integer input '%c'\n", str[i]);
        return 1;
    }
}

这将失败,因为从标准输入读取的str在结尾处有换行符。