首页 文章

for循环中的分段错误[重复]

提问于
浏览
-1

这个问题在这里已有答案:

我得到了这段代码的分段错误,我不能,因为我的生活,找出原因 . 我对指针很新,所以它可能是显而易见的 . 该代码应该从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 回答

  • 1

    问题1:

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

    问题2:

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

  • 1

    这段代码存在很多问题 . 其他人已经指出了问题,但总的来说这是不必要的复杂问题 . 可以消除所有中间变量并直接访问 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;
        }
    }
    

    这将失败,因为从stdin读取的 str 在结尾处有一个换行符 .

相关问题