打开文件后奇怪的段错误?

时间:2015-02-19 08:38:05

标签: c

当我尝试打印fname时,我遇到了一个段错误。有人能解释为什么会发生这种情况吗?是不是我不允许写入文件,关闭它,然后从文件中读取? argv [2]已定义。我尝试了多种不同的分配。

int main(int argc, char *argv[]){
    //Other stuff

    char *rfile=calloc(1, 2049);
    strcpy(rfile, argv[2]);
    FILE *wfile;
    wfile = fopen(argv[2], "w");
    SaveIndexToFile(index, wfile, alpha);  // This does a whole bunch of writing to a the file.
    fclose(wfile);

    //alpha is declared here, and works just fine.
    RemakeIndex(rfile, alpha);
    return 1;
}
int RemakeIndex(char *fname, WordList * alpha){
    printf("%s", fname);
    return 1;
}

4 个答案:

答案 0 :(得分:4)

您没有检查fopen的返回值。如果fopen失败,它可以 返回NULL。如果您正在使用NULL执行某些可能未定义的行为。打开文件后放置此行。

if ( wfile == NULL ){
    perror("fopen");
    return;
} 

并检查argc计数是否为3。如果您没有向./a.out提供参数,那么访问argv[2]也会导致细分错误。

答案 1 :(得分:2)

  

是不是我不允许写文件,关闭它,然后从文件中读取?

是的,在文件[stream]关闭后,您不能从中读取。


注意(OP)的措辞:

  • char * rfile被称为“指向char”的指针。
  • FILE *被称为“文件指针”(或者只是“指向FILE的指针”或通常(但正式错误)只是“文件”。

同样RemakeIndex()main() 中调用,但没有正确的原型。

解决此问题

  • main()之前添加原型:

    int RemakeIndex(char *, WordList *);
    
  • 或在RemakeIndex()之前移动main()的整个实施。


同样,printf()调用'输出可能不会立即显示在控制台上,因为stdout是行缓冲的。

解决此问题

  • 打印出一个尾随的新行:

    printf("%s\n", fname);
    
  • 或printf到stderr,默认情况下它本身不是行缓冲区:

    fprintf(strerr, "%s\n", fname);
    
  • 打印后
  • 或刷新stdout

    printf("%s\n", fname);
    fflush(stdout);
    

答案 2 :(得分:0)

原型化函数非常重要,GCC编译器将假定一个隐式声明的函数(代码中的RemakeIndex)有两个参数都是int,这将使你的代码看起来像这样:

 int RemakeIndex(int fname, int alpha) {
    printf("%s", (char *)fname);
    return 1;
 }

在64位机器上使用GCC,其中指针为64位且整数为32位,那么您的参数将被截断为32位,这可能会导致段错误。其他答案提到了函数原型,如果你使用的是64位编译器,我会建议这是你的问题。

答案 3 :(得分:0)

结果是我在堆上分配了太多的内存。我有一个循环,分配一个unsigned int的max_length字符串。感谢您的所有意见和帮助!