我仍然对C代码中的分段错误有疑问。当我第八次调用函数current_live_read(ainpath);
时,出现错误消息:No source available for "_int_malloc() at 0x25be2"
主要功能如下:
void current_read(void)
{
system(AINinit);
char *ainpath;
ainpath=init_current();
int *current;
float avgcurr=0;
float allcurr=0;
int i=0;
while(1)
{
//sleep(1);
i++;
current=current_live_read(ainpath);
allcurr=allcurr+*current;
avgcurr=allcurr/i;
printf("\n Current: %d AVG: %f", *current, avgcurr);
//free(current);
}
}
current_live_read(ainpath);
就是这样:
int *current_live_read(char *ainpath)
{
//ainpath=init_current();
int curr;
FILE *file = fopen(ainpath, "r");
//free(ainpath);
if(!file)
{
printf("Error opening file: %s\n", strerror(errno));
}
else
{
fscanf(file, "%4d", curr);
fclose(file);
//*current=curr;
}
free(file);
return curr;
}
我知道指针可能出了点问题,但是我不知道该对哪一个指针做些什么。
答案 0 :(得分:1)
关闭FILE *
指针后,可能无法释放它。从手册页:
刷新流,然后关闭与该流关联的文件。之后,该函数释放与该流关联的所有缓冲区。刷新意味着将未写入的缓冲数据写入文件,而未读取的缓冲数据将被丢弃。
因此fclose()
已根据需要进行清理,以防止内存泄漏。如果在该指针上调用free()
,则很可能破坏堆。因此,只需删除free(file);
此外,您必须像这样将指针传递给fscanf()
:
fscanf(file, "%4d", &curr);
否则,您将写入(伪)随机存储器地址。通常最好检查fscanf()
的返回值,以查看转换是否成功并适当地处理错误情况。
这应该可以解决问题。
答案 1 :(得分:0)
因此,我将int *current_live_read(char *ainpath);
更改为int current_live_read(char *ainpath)
,而没有使用指针类型。
制作内部函数:
int curr;
fscanf(file, "%x", &curr)
在主函数中,电流只是整数:
int current;