0

编辑:要回答一些问题,这是经过修改但仍然无法正常工作的代码(大部分都在那里,但我应该明确指出我初始化了文件指针等)。同样,仅当我在 exp() 之前添加写入或完全删除 exp() 时才有效:

FILE *outfile;
char *outfilename;
outfilename = (char *)malloc(FILENAME_MAX*sizeof(char));
strcpy(outfilename, "outfile.txt");
outfile = fopen(realoutfilename, "w");

/* If this is uncommented, there isn't a segfault
if(realoutfile!=NULL && imoutfile!=NULL){
    fprintf(outfile, "\r\n");
    fseek(outfile,0,SEEK_SET);
}
*/

gauss = (double*) calloc(points, sizeof(double));

/* Maths and stuff */

if(outfile!=NULL){
    for(i=0;i<points;i++){
        /* this prints fine */
        printf(outfile, "%g,\r\n", gauss[i]);
        /* Seg fault is here */
        fprintf(outfile, "%g,\r\n", gauss[i]);

    }
}
fclose(outfile);
free(outfile);

我正在编译:

gcc main.c -lm -Wall -Wextra -Werror -Wshadow -g -o main

澄清一下,它没有到达函数的末尾 - 所以它不是崩溃的释放。崩溃是当它尝试在该 for 循环中写入文件时。

我已经检查过 exp() 没有上溢或下溢,正如我所说,我可以 printf 输出,但文件写入是禁止的。如果我尝试一个简单的调用,比如 exp(2),它也会失败。

gdb 回溯是(我对 gdb 不太熟悉,认为它可能会有所帮助):

#0  0xff15665c in _malloc_unlocked () from /lib/libc.so.1
#1  0xff15641c in malloc () from /lib/libc.so.1
#2  0xff1a8c80 in _findbuf () from /lib/libc.so.1
#3  0xff1a8f0c in _wrtchk () from /lib/libc.so.1
#4  0xff1ad834 in _fwrite_unlocked () from /lib/libc.so.1
#5  0xff1ad798 in fwrite () from /lib/libc.so.1
#6  0x000128ac in gaussian ()
#7  0x00010f78 in main ()

任何帮助将不胜感激!

4

3 回答 3

4

问题,就在这里:

outfilename = (char *)malloc(FILENAME_MAX*sizeof(char));
outfilename = "file.txt";

您不能分配这样的字符串,您必须使用strcpy

strcpy(outfilename, "file.txt");

发生的事情是您正在outfilename用字符串赋值覆盖指针。然后你尝试释放它free(outfilename);。由于您正在释放字符串文字,因此行为未定义,因此您遇到了崩溃。

至于为什么它在一种情况下而不是另一种情况下崩溃。行为是未定义的,因此任何事情都可以发生。您的指数函数代码可能对堆栈/堆做了一些可能导致它崩溃/不崩溃的事情。

编辑:我希望这只是一个错字或错误复制,但我也没有看到outfile初始化的位置。如果它真的从未被初始化,那么这是另一个错误。(并且很可能是导致您的特定段错误的那个)

所以它应该是这样的:

FILE *outfile;
outfilename = (char *)malloc(FILENAME_MAX*sizeof(char));
strcpy(outfilename, "file.txt");

outfile = fopen(outfilename, "w");
if (outfile == NULL){
    //  Error, file cannot be openned.
}
于 2011-11-18T06:41:26.237 回答
1
outfilename = "file.txt";
/* snip */
free(outfilename);

你只能释放你从malloc. 您不能将free指针传递给常量!

于 2011-11-18T06:47:48.647 回答
1

首先,您确实应该在启用所有警告并生成调试信息的情况下进行编译;gcc这意味着-Wall -g旗帜。

FILE *outfile;
outfilename = (char *)malloc(FILENAME_MAX*sizeof(char));
outfilename = "file.txt";

你应该使用strdup,我看不到对fopen例如的调用

 outfile = fopen(outfilename, "r");

你应该学会使用调试器gdb(或者它的ddd图形前端)。

于 2011-11-18T06:43:55.673 回答