glibc обнаружил ошибку - id3Tag
Итак, я новичок в 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 ответ
Нет free
звонки в этом коде, так что я полагаю, вы счастливы, что ничего не освобождаете дважды? Поэтому, я полагаю, у вас тут какая-то куча коррупции. Т.е. вы записываете больше данных в тег, чем есть место для.
Во-первых, я не думаю, что здесь проблема в @H2CO3. Возможно, проблема, о которой он упоминает, существует - в этом случае вы повредите свой файл данных - но это не похоже на причину сбоя программы.
Я думаю, что ваша настоящая проблема в том, что вы никогда ничего не назначаете in_file
! Я думаю, что вам нужно:
in_file = fopen (argv[1], "rb");
Некоторые другие комментарии:
strcmp
возвращает ноль (ложь), когда строка соответствует, и ненулевое (истина), когда она не совпадает... поэтому все ваши сравнения выглядят неработающими - это не должно вызывать искажения.- Появляется цикл для проверки значений аргументов, а также переключателей - вы должны пропустить их.
- Нет необходимости открывать файл дважды - вы можете открыть его как для чтения, так и для записи в начале.
- Вам нужно добавить намного больше ошибок, если файл не существует или не соответствует вашим ожиданиям - но тогда я уверен, что вы это знали.