Значение указывает на изменения после чтения строки по другому адресу - PullRequest
1 голос
/ 18 марта 2020

Я прошу прощения, если что-то подобное ранее было задано и / или получено, и если мой заголовок странно сформулирован.

У меня есть узел, который мне нужно заполнить некоторыми тегами из заголовка файла (контейнер 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 */
}

1 Ответ

1 голос
/ 18 марта 2020

Моя проблема не заключалась в выделении достаточного количества памяти для указателя Node *! Удаление звездочки устранило проблему!

Слава @ user3121023 за сообщение! (и остальным комментаторам за то, что научили меня хорошей практике)

...