Я прошу прощения, если что-то подобное ранее было задано и / или получено, и если мой заголовок странно сформулирован.
У меня есть узел, который мне нужно заполнить некоторыми тегами из заголовка файла (контейнер 94 байта, не NULL прекращается). Моя проблема в том, что после выполнения вызова fgets () значение, на которое указывает char * path, изменяется, и в результате я получаю двойное освобождение или повреждение при попытке вызвать free (path).
Что может вызвать эту ошибку? Если я выделю путь статически, тогда моя проблема переместится в вызов fclose (). Еще одна вещь, которую я должен упомянуть, это то, что вызов mallo c для path не возвращает NULL.
Файл, из которого я читаю, выглядит следующим образом:
2
ADD_FIRST Gorillaz - Feel Good Inc.mp3
ADD_FIRST Metallica - Battery.mp3
Мой каталог содержит:
main.c
media.in
./songs/Gorillaz - Feel Good Inc.mp3
./songs/Metallica - Battery.mp3
!! Это на самом деле не mp3-файлы. Они были созданы нашими лаборантами для этого упражнения. Я должен разобрать теги из заголовка этих файлов (контейнер 94 байта). Вот шестнадцатеричная Чувство хорошего самочувствия в c.:
Offset: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00000000: 54 41 47 E6 43 DD 7C 57 B1 19 D8 03 A8 83 60 54 TAGfC]|W1.X.(.`T
00000010: 8C 04 AF BF 0A 80 42 46 C0 12 B0 B1 1E CD B8 D6 ../?..BF@.01.M8V
00000020: 0D 61 BC 50 3E 38 A7 F0 51 80 F3 FA 03 53 4E 8F .a<P>8'pQ.sz.SN.
00000030: 58 FD 4F 62 7D 91 A8 3D A4 58 EF C2 26 A7 98 33 X}Ob}.(=$XoB&'.3
00000040: 09 55 84 47 8D 2B 37 DF AB 2B D9 AF 7E 27 3E D6 .U.G.+7_++Y/~'>V
00000050: 25 8D 39 A2 1F E1 E0 C3 3A CF 85 60 76 1E 93 7F %.9".a`C:O.`v...
00000060: 73 17 C7 00 43 FE DF EE 29 B8 9D A8 E0 DC 7E 05 s.G.C~_n)8.(`\~.
00000070: 69 B7 A7 88 99 87 4B D3 56 D1 33 CD EF C6 4C 62 i7'...KSVQ3MoFLb
00000080: DE 13 62 21 12 42 0F 3B FA AD E3 DA 89 62 54 41 ^.b!.B.;z-cZ.bTA
00000090: 47 19 87 7B B2 0E C6 85 65 97 B8 32 86 7F 7E E8 G..{2.F.e.82..~h
000000a0: 5D 92 4B 7E A4 8D 8D DF 87 3A C3 62 C3 25 41 B6 ].K~$.._.:CbC%A6
000000b0: 3E C8 31 F1 D7 F7 76 3C 8F 2F 6E 15 AE EC FE 0B >H1qWwv<./n..l~.
000000c0: 7E 49 89 22 D6 16 02 5D 51 C5 BF 14 EA 01 CA 28 ~I."V..]QE?.j.J(
000000d0: C9 FB 19 A0 F3 90 DC 82 BF 4A 97 6D 37 95 78 B5 I{..s.\.?J.m7.x5
000000e0: DE 01 D8 B4 17 DA 12 68 9F D1 7D 89 D2 47 B1 9C ^.X4.Z.h.Q}.RG1.
000000f0: 43 CB 3C 36 5B 19 B8 1A 63 4F 87 9A E5 FF 50 C3 CK<6[.8.cO..e.PC
00000100: 00 28 78 17 02 8A 80 A1 5B FD 2A 2E 44 DB CA 54 .(x....![}*.D[JT
00000110: 41 47 46 65 65 6C 20 47 6F 6F 64 20 49 6E 63 00 AGFeel.Good.Inc.
00000120: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000130: 47 6F 72 69 6C 6C 61 7A 00 00 00 00 00 00 00 00 Gorillaz........
00000140: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 46 65 ..............Fe
00000150: 65 6C 20 47 6F 6F 64 20 49 6E 63 00 00 00 00 00 el.Good.Inc.....
00000160: 00 00 00 00 00 00 00 00 00 00 00 00 32 30 30 35 ............2005
Вот репродукция:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MAXLINESIZE 100
#define MAXPATHSIZE 100
#define CONTAINERSIZE 94
union meta{
char charptr[100];
struct info {
char title[30];
char artist[30];
char album[30];
char year[4];
}tags;
};
struct Node {
int curr;
struct Node *next, *prev;
union meta *data;
};
struct DoublyLinkedList {
int size;
struct Node *head, *tail;
};
void get_Meta(struct Node *p, char *filename) {
FILE *in;
char *path;
path = (char *)malloc(sizeof(char) * MAXPATHSIZE);
strcpy(path, "./songs/");
strcat(path, filename);
in = fopen(path, "rb");
fseek(in, 0, SEEK_END);
fseek(in, -CONTAINERSIZE, SEEK_CUR);
fgets(p->data->charptr, 100, in);
free(path);
fclose(in);
}
void add_first(struct DoublyLinkedList *list, char *filename) {
struct Node *p, *q;
p = malloc(sizeof(struct Node *));
p->data = malloc(sizeof(union meta *));
p->curr = 0;
p->next = NULL;
p->prev = NULL;
get_Meta(p, filename);
if(list->head == NULL) {
p->curr = 1;
list->head = p;
list->tail = p;
list->size++;
} else {
q = list->head;
q->prev = p;
p->next = q;
p->prev = NULL;
list->head = p;
list->size++;
}
}
int main () {
FILE *in;
int i, commandCount;
char *command, *filename, c;
struct DoublyLinkedList *list = malloc(sizeof(struct doublyLinkedList *));
filename = malloc(sizeof(char) * MAXLINESIZE);
command = malloc(sizeof(char) * MAXLINESIZE);
in = fopen("media.in", "r");
fscanf(in, "%d\n", &commandCount);
while(commandCount) {
fgets(command, MAXLINESIZE, in);
command = strtok(command, " ");
filename = strtok(NULL, "\n");
if (strcmp(command, "ADD_FIRST") == 0) {
add_first(list, filename);
}
commandCount--;
}
/* FREEs */
}