glibc检测到错误 - id3Tag

时间:2012-02-05 18:22:27

标签: c glibc id3-tag

所以,我是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);

1 个答案:

答案 0 :(得分:1)

此代码中没有free次调用,所以我认为你很高兴你没有双重任何东西?因此,我认为你在这里有一些堆腐败。即你在标签上写的数据多于空间。

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

我认为你真正的问题是你永远不会给in_file分配任何东西!我想你需要:

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

其他一些评论:

  • strcmp在字符串匹配时返回零(false),当匹配时返回非零(true)所以你的所有比较都显示为破坏 - 不应该导致腐败。
  • 循环似乎检查参数值和开关 - 你应该跳过这些。
  • 无需打开文件两次 - 您可以在开始时打开它进行读取和写入。
  • 如果文件不存在或不符合您的期望,您需要进行更多错误检查 - 但我确信您知道这一点。