【问题标题】:Segmentation fault SIGSEGV error on BeagleBoneBeagleBone 上的分段错误 SIGSEGV 错误
【发布时间】:2023-04-15 03:55:01
【问题描述】:

C 代码中的分段错误仍然存​​在问题。当我第 8 次调用函数 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;
}

我知道指针可能有问题,但我不知道是哪一个以及我能做些什么。

【问题讨论】:

  • 另外,请注意永远不要在FILEs 上使用free。只给他们打电话fclose

标签: c embedded beagleboneblack


【解决方案1】:

关闭FILE * 指针后,您可能无法释放它。从手册页:

刷新流,然后关闭与该流关联的文件。之后,该函数释放与流关联的所有缓冲区。刷新意味着将未写入的缓冲数据写入文件,并丢弃未读取的缓冲数据。

所以fclose() 已经根据需要进行了清理以防止内存泄漏。如果你在那个指针上调用free(),你很可能会破坏你的堆。所以只需删除free(file);

此外,您必须像这样将 指针 传递给fscanf()

fscanf(file, "%4d", &curr);

否则,您将写入(伪)随机内存地址。通常最好检查fscanf() 的返回值,看看是否转换成功并适当地处理错误情况。

这应该可以解决问题。

【讨论】:

  • 现在 fscanf(file, "%4d", curr); 发生在 int *current_live_read(char *ainpath) 函数中。我有错误No source available for "_IO_vfscanf_internal() at 0x432c4"。可能int *curr的声明是错误的;
  • @Pukacza 这确实是第二期,见编辑
  • 现在fscanf(file, "%4d", &curr); 不会向 *curr 传输任何值。 fscnf 之后的值为 NULL。
  • 您是否按照我的建议检查了 fscanf 的返回值?应该为1,否则文件格式无效导致转换失败
  • @Pukacza 您需要了解指针的工作原理。您必须先初始化它们,然后才能使用它们。
【解决方案2】:

所以我将int *current_live_read(char *ainpath); 更改为int current_live_read(char *ainpath),没有指针类型。 制作内部函数: int curr;fscanf(file, "%x", &curr) 在 main 函数中,电流只是整数: int current;

【讨论】:

    最近更新 更多