【问题标题】:fgets in fputs gives segmentation faultfputs 中的 fgets 给出分段错误
【发布时间】:2014-06-21 05:11:16
【问题描述】:

我尝试了以下代码并得到了分段错误-

    int size=30;
    char *str;
    fputs(fgets(str,size,STDIN),STDOUT);

但是当我运行它时 -

    buff=fgets(str,size,STDIN);
    fputs(buff,STDOUT);

它工作得很好。此外,如果我对 str 使用 malloc,则运行第一个代码。我不明白这是怎么回事。

【问题讨论】:

  • 我怀疑fgets 的返回使用了内部缓冲区(或者可能是某些编译器特定的优化效果(魔术))。在您的第一种情况下,尽管您没有任何缓冲区,因为 str 只是一个指针而不是缓冲区。

标签: c segmentation-fault malloc fgets fputs


【解决方案1】:

你的问题在这里:

char *str;
// de-referenece str in ANY way.

你有一个指针,它可以指向任何地方。像这样访问任意内存是未定义的行为。

它在一种情况下有效但在另一种情况下无效的事实纯属巧合,您应该提供适当的缓冲区,例如:

char str[100]; // or whatever size you need.

或使用malloc 动态分配内存,正如您已经发现的那样。

一旦你进入了未定义行为的阴暗世界,所有的赌注都没有了。

它可能会崩溃,它可能会起作用,它可能会导致飞猪或鼻恶魔或你当地的时空区域崩溃成一个奇点。最重要的是,不要这样做:-)

【讨论】:

  • 我理解但不是fputs(fgets(str,size,STDIN),STDOUT); & `buff=fgets(str,size,STDIN); fputs(buff,标准输出); '同样的事情?
  • 是和不是。它们都是未定义的行为,但它们可能有不同的结果,这就是 UB 的重点。事实上,完全相同的 UB 代码完全可以在今天做一件事情,明天做一件不同的事情。根据我的最后一段,在您使用 UB 时,所有赌注都已取消。
  • 我在哪里可以了解内部工作?建议,如果有的话。因为我不能从手册页中得到很多关于这个的信息。提前致谢
猜你喜欢
  • 2015-09-18
  • 1970-01-01
  • 2013-01-19
  • 2016-01-15
  • 1970-01-01
  • 2013-01-03
  • 1970-01-01
  • 2020-03-10
  • 2015-08-27
相关资源
最近更新 更多