Почему второй malloc терпит неудачу в этом сценарии? - PullRequest
1 голос
/ 23 сентября 2019

В настоящее время я работаю над фрагментом кода, где мы анализируем файл и работаем с различными функциями.При отладке с помощью вызовов printf я обнаружил, что при втором вызове malloc получаю ошибку памяти.Что может вызвать сбой второго malloc в этом грубом скелете?

struct example {
    char *myChar;
    int myInt;
};

struct example *doThing(FILE *file) {
    struct example *myToken = (struct example *)malloc(sizeof(struct example));
    char buffer[32] = "";

    // other stuff

    if (strncmp(buffer, "random", 6) == 0) {
        strncpy(myToken->myChar, buffer, 6);
        myToken->tokenid = 1;
        return myToken;
    }

    return NULL; 
}

struct example *doThing2(FILE *file) {
    struct example *myOtherToken = (struct example *)malloc(sizeof(struct example));
    // other stuff
    return myOtherToken;
}

int main() {
    FILE *ofp = fopen("thefile.txt", "r");
    struct example *token1, *token2;

    token1 = doThing(ofp);
    token2 = doThing2(ofp);

    // other stuff

    free(token1);
    free(token2);
    return 0;
}

1 Ответ

2 голосов
/ 23 сентября 2019

Вы столкнулись с утечкой памяти.исправьте ваш код, следуя одному из двух примеров ниже

, и да, как уже упоминалось @Eugene_Sh, вы должны выделить память для myToken->myChar и не забудьте освободить ее перед освобождением myToken

SAMPLE 1
struct example* doThing(FILE *file) {

    char buffer[32] = "";

    // other stuff

    if (strncmp(buffer, "random", 6) == 0) {

        struct example *myToken = (struct example *) malloc(sizeof(struct example));

        myToken ->myChar= malloc(7);
        strncpy(myToken ->myChar, buffer, 6);
        myToken ->myChar[6]=0;
        myToken->tokenid = 1;
        return myToken;
    }

    return NULL; 
}
ОБРАЗЕЦ 2
struct example* doThing(FILE *file) {
    struct example *myToken = (struct example *) malloc(sizeof(struct example));
    char buffer[32] = "";

    // other stuff

    if (strncmp(buffer, "random", 6) == 0) {


        myToken ->myChar= malloc(7);
        strncpy(myToken ->myChar, buffer, 6);
        myToken ->myChar[6]=0;
        myToken->tokenid = 1;
        return myToken;
    }
    free(myToken );
    return NULL; 
}
...