一个fgets实现中的分段错误,而不是另一个类似的实现

时间:2015-03-25 03:12:19

标签: c fgets

我试图理解这个问题背后的原因;我在两个独立的程序中有两个非常相似的fgets实现。其中一个没有任何问题,另一个导致分段错误。我能看到的两个程序之间的唯一区别是工作的程序不接受任何命令行参数,而不起作用的程序就是。

是否有人能够帮助我理解其中的差异?我知道你不能将fgets用于你没有分配内存的东西,那么为什么第一个例子能正常工作呢?

非常感谢!

工作代码(缺少相关部分):

int main(){
    char *s;
    while((fgets(s,100,stdin))){
        if (evaluate_checksum(s)){
            printf("%s",s);
        }
    }
}

无效代码:

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

int main(int argc, char **argv){
    int a;
    int b;
    int c;
    int d;
    sscanf(argv[1],"%d", &a);
    sscanf(argv[2],"%d", &b);
    sscanf(argv[3],"%d", &c);
    sscanf(argv[4],"%d", &d);

    char *line;
    long u1;
    long v1;
    long u2;
    long v2;

    while ((fgets(line,100,stdin))){
      printf("%s", line);
      char *endptr = line;
      u1 = strtol(line,&endptr,10);
      v1 = strtol(entptr,&endptr,10);
      u2 = strtol(endptr,&endptr,10);
      v2 = strtol(endptr,&endptr,10);
      printf("%ld, %ld, %ld, %ld",u1,v1,u2,v2);
    }

}

2 个答案:

答案 0 :(得分:4)

由于您正在将数据读入尚未获取的内存中,因此两个版本都会显示未定义的行为。在第一种情况下,它立即不明显。在第二种情况下,它很明显。试图理解他们的行为并不富有成效。

答案 1 :(得分:2)

而不是使用char指针来存储字符串,你应该使用char数组。