BeagleBone上的分段错误SIGSEGV错误

时间:2019-09-02 18:42:18

标签: c embedded beagleboneblack

我仍然对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;
}

我知道指针可能出了点问题,但是我不知道该对哪一个指针做些什么。

2 个答案:

答案 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;