2015-04-29 1 views
-4

Hey je commence à travailler sur le codage de Huffman et j'ai un peu un problème que j'obtenir cette erreurC Segmentation fault (core dumped)

Segmentation fault (core dumped)

Je comprends qu'il est causé en essayant d'atteindre la mémoire que vous êtes ne permet pas de mais je ne peux pas réaliser quel est le problème dans mon code, merci d'avance pour l'aide!

src.txt - http://pastebin.com/kDf8nEhV

#include <stdio.h> 
#include <stdlib.h> 

int freq[256] = {0}; 

struct Node { 
    unsigned char m_ch; 
    int m_freq; 
    struct Node* m_ls, *m_rs; 
    struct Node* m_hls, *m_hrs; 
}; 

struct Node* createNode(int freq, char ch); 
void insertTree(struct Node** root, struct Node* n); 
struct Node* getBinTree(FILE* fsrc); 
void inorder(struct Node* root); 

int main() { 
    FILE* fsrc; 
    struct Node* tree = (struct Node*)malloc(sizeof(struct Node)); 
    fsrc = fopen("src.txt", "rb"); 
    tree = getBinTree(fsrc); 
    inorder(tree); 
    return 1; 
} 

struct Node* createNode(int freq, char ch) { 
    struct Node* pNode = (struct Node*)malloc(sizeof(struct Node)); 
    pNode->m_freq = freq; 
    pNode->m_ch = ch; 
    return pNode; 
} 

void insertTree(struct Node** root, struct Node* n) { 
    if (!(*root)) { 
     *root = n; 
     return; 
    } 
    if (n->m_freq < (*root)->m_freq) { 
     insertTree(&(*root)->m_ls, n); 
    } else { 
     insertTree(&(*root)->m_rs, n); 
    } 
} 

struct Node* getBinTree(FILE* fsrc) { 
    struct Node* temp = (struct Node*)malloc(sizeof(struct Node)); 
    struct Node** root = (struct Node**)malloc(sizeof(struct Node*)); 
    *root = (struct Node*)malloc(sizeof(struct Node)); 
    int c, i; 
    while ((c = fgetc(fsrc)) != EOF) { 
     freq[c]++; 
    } 
    freq[255] = 1; 
    fclose(fsrc); 
    for (i = 0; i < 256; i++) { 
     if (freq[i] > 0) { 
      temp = createNode(freq[i], i); 
      insertTree(root, temp); 
     } 
    } 
} 

void inorder(struct Node* root) { 
    if (root != NULL) { 
     inorder(root->m_ls); 
     printf(" %d\n", root->m_freq); 
     inorder(root->m_rs); 
    } 
    return; 
} 
+3

Il y a des problèmes tout au long de votre code. Certaines fonctions ne retournent pas les valeurs qui devraient être, les valeurs retournées ne sont pas vérifiées pour les erreurs, etc. Je vois beaucoup d'endroits où vous pourriez obtenir un segfault. Lequel voulez-vous de l'aide? Sur quelle ligne rencontrez-vous votre problème? –

Répondre

0

Votre,

struct Node* getBinTree(FILE *fsrc) 

est rien de retour.

Vous devez activer les avertissements du compilateur, le compilateur vous l'aurait dit, la fonction ne renvoie pas de valeur, mais vous l'attribuez toujours à tree dans main().

Mais à part cela il y a un sérieux problème avec votre code, un exemple simple

int main() 
{ 
    FILE *fsrc; 
    struct Node *tree = (struct Node*)malloc (sizeof(struct Node)); 
    fsrc = fopen("src.txt","rb"); 
    tree=getBinTree(fsrc); 
    inorder(tree); 
    return 1; 
} 

Cette fonction unique a beaucoup de problèmes,

  1. vous allouez une nouvelle mémoire et le point à avec tree, mais vous ne l'utilisez jamais car vous remplacez le pointeur ici

    tree = getBinTree(fsrc); 
    

    qui provoque une fuite de mémoire.

  2. Vous ne vérifie pas si le fichier a été ouvert succesfuly, vous devez vérifier

    fsrc = fopen("src.txt", "rb"); 
    if (fsrc == NULL) 
        return -1; 
    
  3. Vous n'êtes pas obligé de castmalloc()

    struct Node *tree = malloc(sizeof(*tree)); 
    

    cela est plus robuste et plus facile lire.

  4. Vous devez vous assurer que malloc() ne manquèrent pas allouer de la mémoire, quand il ne NULL est retourné, si vous avez besoin quand vous faites une malloc() qui est réellement nécessaire, par exemple dans getBinTree()

    struct Node * tree = malloc (sizeof (* arbre)); if (arbre == NULL) return NULL;

    c.-à-d. Copier le comportement de malloc() en retournant NULL en cas d'échec.

+0

http: // pastebin.com/1v5xQBQ9 fait ces changements en fonction de votre réponse, toujours le même problème vos réponses (1) et (3) m'a un peu confondu si – Raz

+0

@Raz Vous l'avez beaucoup amélioré, certains problèmes de style mais ils sont une question de goût et l'expérience, par exemple une seule ligne 'malloc()' et une vérification d'erreur, peuvent prêter à confusion, je vais jeter un oeil pour voir ce qui pourrait se passer. –

+0

@Raz Ne fermez pas le fichier dans une fonction qui ne l'a pas ouvert, cela pourrait être déroutant. Pouvez-vous ajouter à votre question le contenu du fichier s'il vous plaît. –