【问题标题】:glibc detected error - id3Tagglibc 检测到错误 - id3Tag
【发布时间】:2012-02-05 18:22:27
【问题描述】:

所以,我是 C 的新手,我一直在尝试编写这个工具来从命令行编辑音乐文件上的 id3 标签。我一直收到这个错误:

* glibc 检测到 双重释放或损坏(顶部):0x0000000000502010 **

根据我的阅读,我知道这与释放内存有关。不过,我只是不确定从这里去哪里。无论如何,我的逻辑是,如果存在标签,我会读入该标签,然后从命令行中指定的字段中进行任何需要进行的更改。这是给我带来麻烦的障碍。感谢您提前提供任何见解!

    fopen(argv[1], "rb");
    fseek(in_file, -128, SEEK_END);
    fread(&tagTest, sizeof(struct iD3Tag), 1, in_file);
    fclose(in_file);

    for (x = 2; x < argc-1; x++)
    {            
        if (strcmp(argv[x], "-title"))
            strncpy(tagTest.title, argv[x+1], 30);
        if (strcmp(argv[x], "-artist"))
            strncpy(tagTest.artist, argv[x+1], 30);
        if (strcmp(argv[x], "-album"))
            strncpy(tagTest.album, argv[x+1], 30);
        if (strcmp(argv[x], "-year"))
            strncpy(tagTest.year, argv[x+1], 4);
        if (strcmp(argv[x], "-comment"))
            strncpy(tagTest.comment, argv[x+1], 28);
        if (strcmp(argv[x], "-track"))
            tagTest.track = atoi(argv[x+1]);
    }

    tagTest.seperator = 0;

    fopen(argv[1], "r+b");
    fseek(in_file, -128, SEEK_END);
    fwrite(&tagTest, sizeof(struct iD3Tag), 1, in_file);
    fclose(in_file);

【问题讨论】:

  • fread(&amp;tagTest, sizeof(struct iD3Tag), 1, in_file); 是不行的。由于内存对齐约束,结构在结构成员之间具有内部填充,因此您的标签信息基本上会被破坏......
  • struct iD3Tag的定义是什么?

标签: c glibc id3-tag


【解决方案1】:

这段代码中没有free 调用,所以我想你很高兴你没有双重释放任何东西?因此,我认为您这里有一些堆损坏。 IE。您在标签中写入的数据超出了空间的容量。

首先,为了解决@H2CO3 的问题,我认为这不是问题所在。可能是他提到的问题确实存在——在这种情况下你会损坏你的数据文件——但看起来这不是程序失败的原因。

我认为你真正的问题是你从来没有给in_file分配任何东西!我认为你需要:

in_file = fopen (argv[1], "rb");

其他一些cmets:

  • strcmp 在字符串匹配时返回零 (false),在 not 匹配时返回非零 (true) ...因此您的所有比较似乎都已损坏 - 这不会导致损坏。李>
  • 循环似乎检查参数值以及开关 - 您应该跳过这些。
  • 无需打开文件两次 - 您可以在开始时打开它进行读取和写入。
  • 您需要进行更多的错误检查,以防文件不存在或不是您所期望的 - 但我相信您知道这一点。

【讨论】:

  • 非常感谢!我什至没有意识到 strcmpfopen (证明我在 C 方面的经验不足)。另一个问题,当你说循环检查参数值和开关时,你的意思是什么?此外,我对 if 语句进行了更改,但现在每当我在同一个文件上运行程序两次时,我都会遇到一些分段错误。当我在第二个程序运行中编辑它后去查看标签时,它并没有打印整个东西。
  • 想象你有参数“-title foo -artist bar”。您的代码首先检查“-title”是否是一个选项;它是正确的(或者如果你有正确的 strcmp 的话)。然后它做的下一件事是检查“foo”是否是一个选项,但它真的应该已经消耗了它。
  • 哦。我现在知道了。再次感谢你。我终于让一切都按照它应该的方式工作了哈哈
猜你喜欢
  • 2011-01-15
  • 1970-01-01
  • 2011-06-21
  • 2015-12-19
  • 2016-07-22
  • 1970-01-01
  • 2014-07-02
  • 2012-10-25
相关资源
最近更新 更多