【问题标题】:segmentation error in the fseek line in c codec 代码中 fseek 行中的分段错误
【发布时间】:2015-04-23 23:33:35
【问题描述】:

我不断收到分段错误,并将其缩小到一行(它是下面代码中的“fseek”行 - 我将它下面的所有内容都注释掉了,但仍然得到错误,但当我没有得到它时注释掉那一行。)这是我的代码:

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) 
{
    FILE *f_in, *f_out;
    f_in = fopen(argv[1], "rb");
    fseek(f_in, 0, SEEK_SET);
    return 0
}

所有其他代码看起来都很好,所以我没有包含它。我尝试在 fseek 行之前添加一行:“fseek(f_in, 0, SEEK_END);”。我还尝试将 0 更改为其他数字,并在 fseek 之前进行 fread,但始终遇到分段错误。有谁知道那条线有什么问题(或不同的线,如果它实际上不是那条线)?

【问题讨论】:

  • 2 个明显的问题:1-您没有检查argc 以确保有argv[1]。 2 - 在你去尝试使用它之前,你没有检查fopen() 的结果。解决这些问题并与我们联系...
  • 您确实知道,在调用 fopen 之后,文件指针立即位于文件的第一个字符处。所以不需要在文件的第一个字符处调用 fseek()。
  • 哦,有道理。好吧,由于 fseek 导致了问题,而我实际上并不需要它,这解决了分段错误,谢谢 :)
  • (@John3136,是的,我意识到这一点。我没有故意包含这些部分,因为虽然包含它们是一种很好的编码实践,但它们与我关注的错误无关。否则好的建议,谢谢)

标签: c segmentation-fault


【解决方案1】:

检查对fopen()的调用是否失败:

f_in = fopen(argv[1], "rb");
if ( NULL == f_in )
{
    // handle error
    .
    .
    .

【讨论】:

    【解决方案2】:

    假设实际代码在访问 argv[] 之前检查 argc,并且如果不存在参数,则会显示适当的“使用”消息。

    必须检查 fopen(和 fseek)的返回值以确保操作成功。

    如果此代码在 fseek() 上失败,则几乎可以肯定 fopen 失败。

    导致 f_in 包含 NULL 而不是指向文件描述符对象的有效指针。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-16
      • 1970-01-01
      • 1970-01-01
      • 2019-01-22
      相关资源
      最近更新 更多