当我尝试打印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;
}
答案 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字符串。感谢您的所有意见和帮助!