简体   繁体   中英

C projet work as well in Linux but not working in MacOs

My friend built a C projet on his Linux computer and when he sent it to me and i tried to execute it but it didn't work. Can u help me with finding a solution?.
Error message in my MacOs

when i tried to debug i found a problem here, it stuck in this while loop在此处输入图像描述

in the main we call the function init_dicContexte()

#include <stdlib.h>
#include <string.h>

#include "liste_mots.h"
#include "liste_freq.h"
#include "dict_contexte.h"


int main(void) {

    char* texte;

    FILE* fichier;
    if ((fichier = fopen("Jane_Austen_Emma2.txt", "r"))==NULL)
        raler("fopen");

    if(fseek( fichier , 0L , SEEK_END))
        raler("fseek");
    long taille_fichier = ftell(fichier);
    rewind(fichier);

    texte = calloc(1, taille_fichier+1);
    if (texte == NULL){
        fclose(fichier);
        raler("calloc");
    }

    if(fread(texte, taille_fichier, 1, fichier)!=1){
        fclose(fichier);
        free(texte);
        raler("fread");
    }

    dictContexte mon_dict = init_dictContexte(texte);

    afficher_dict(mon_dict);

    genererTexte(mon_dict, 15);

    free(texte);
    return 0;
}

init_dictContext() is like that

dictContexte init_dictContexte(char* t) {

    int i = 0;

    listeFreq liste_freq = frequencesDe(t);
    _listeFreq freq_cour = liste_freq.liste;

    // allocation de l'espace mémoire
    dictContexte nouv_dict = malloc(sizeof(struct a_dictContexte));
    dictContexte contexte_cour = nouv_dict;

    printf("Creation du dictionnaire de contexte..\n");

    while (freq_cour->freq_suivante!=NULL && k <2) {

        i++;

        contexte_cour->contexte = contexte(t, freq_cour->mot);
        strcpy(contexte_cour->mot, freq_cour->mot);

        dictContexte nouv_contexte = malloc(sizeof(struct a_dictContexte));
        strcpy(nouv_contexte->mot, "\0");
        contexte_cour->suivant = nouv_contexte;

        // ajout d'un contexte
        contexte_cour = nouv_contexte;
        freq_cour = freq_cour->freq_suivante;
    }

    nouv_dict->taille = i;

    detruit_liste_freq(liste_freq.liste);
    return nouv_dict;
}

It looks like you are trying to create a linked list. Typically, the "next" member of the last node in the list should be set to NULL so you can know where the list ends. I can't see you are doing that.

Sometimes it may happen that the memory returned by malloc is initialized to zero. When this happen, the "next" member will have the value NULL and the program will have the appearance of working. But this is purely by chance, and you cannot rely on that.

The error: pointer being free'd was not allocated is an example of heap corruption.

Heap corruption bugs are notorious in that the program appears to work, and then suddenly crashes when given a different input, or moved to a different system.

If your friend were to build the program on Linux using address sanitizer ( gcc -fsanitize=address... ), he would discover that the bug is present on Linux as well.

To tell you where the actual bug is, we'd need an MCVE .

But you can help yourself: run the executable under debugger, set a breakpoint on malloc_error_break (as the error message tells you), use where command and you will find out exactly where the error is detected.

PS It looks like the pointer being free() has not been initialized (ie contains "random" garbage).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM