程序运行不正常(意味着输出(printf)),但是在gdb t.exe中它运行良好

时间:2019-01-26 11:31:24

标签: c gcc gdb printf mingw

我目前遇到一个奇怪的支付问题。 当我这样做时运行程序时:t我得到以下结果: result of the execution of the t.exe

基本上是我程序的开始:

但是,当我使用这样的gdb:gdb t.exe时,一切都可以正常运行:result of the execution in debug mode

下面是我的代码(很抱歉,它不干净:/)

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


typedef int typeElem;

typedef struct  aa {
  typeElem v ;
  struct aa * fg , * fd ;  // les fils gauche et droit
} abr;

#define arbre_vide NULL

typedef abr *arbre;

typedef int boolean;

arbre consa(typeElem x, arbre fils_gauche, arbre fils_droit) {
    arbre N = malloc ( sizeof( arbre ) ) ;
    N->fg = fils_gauche;
    N->fd = fils_droit;
    N->v = x;
    return N;
}

void destruct(arbre ABR) {
    free(ABR);
}

arbre gauche(arbre ABR) {
    return ABR->fg;
}

arbre droit(arbre ABR) {
    return ABR->fd;
}

int estVideArbre(arbre ABR) {
    return (ABR == NULL);
}

typeElem racine(arbre ABR){
    return (ABR->v);
}

/*
void destructAbr(arbre ABR){
    if(!estVideArbre(ABR)){
        destructAbr(gauche(ABR));
        destructAbr(droit(ABR));        
    }
}
*/

void infixe(arbre ABR){
    if(!(ABR == NULL)){
        infixe(ABR->fg);
        printf("%d ", ABR->v);
        infixe(ABR->fd);
    }
    else {
        //printf("est null \n");
    }
}

void prefixe(arbre ABR){
    if(!estVideArbre(ABR)){
        printf("%d ", ABR->v);
        infixe(ABR->fg);
        infixe(ABR->fd);
    }
}

void postfixe(arbre ABR){
    if(!estVideArbre(ABR)){
        infixe(gauche(ABR));
        infixe(droit(ABR));
        printf("%d ", racine(ABR));
    }
}
int nbrTotalNoeuds(arbre ABR) {
    if(estVideArbre(ABR))
        return 0;
    return 1 + nbrTotalNoeuds(gauche(ABR)) + nbrTotalNoeuds(droit(ABR));
}


int nbreNoeudsDe2Fils(arbre ABR) {
    if( !estVideArbre(gauche(ABR)) && !estVideArbre(droit(ABR)) ){
        return 1 + nbreNoeudsDe2Fils(gauche(ABR)) + nbreNoeudsDe2Fils(droit(ABR));
    }
    else if (!estVideArbre(gauche(ABR)) && estVideArbre(droit(ABR)) ) {
        return nbreNoeudsDe2Fils(gauche(ABR));
    }
    else if (estVideArbre(gauche(ABR)) && !estVideArbre(droit(ABR)) ) {
        return nbreNoeudsDe2Fils(droit(ABR));
    }
    else {
        return 0;
    }
}


int nbreNoeudsDe1Fils(arbre ABR) {
    if( gauche(ABR) != NULL && droit(ABR) != NULL ) {
        return 0 + nbreNoeudsDe1Fils(gauche(ABR)) + nbreNoeudsDe1Fils(droit(ABR));
    }
    else if( gauche(ABR) != NULL && droit(ABR) == NULL ) {
        return 1 + nbreNoeudsDe1Fils(gauche(ABR));
    }
    else if( gauche(ABR) == NULL && droit(ABR) != NULL ) {
        return 1 + nbreNoeudsDe1Fils(droit(ABR));
    }
    else {
        return 0;
    }
}


/*
        5
       / \
      3   6
     / \   \
    2   4   7
             \
              9
*/


int main() { //test


    printf("Lancement du programme \n");
    arbre rac_g = consa(2,arbre_vide,arbre_vide);
    arbre rac_d = consa(4,arbre_vide,arbre_vide);

    arbre rac_d_d_d = consa(9,arbre_vide,arbre_vide);
    arbre rac_d_d = consa(7,arbre_vide,rac_d_d_d);

    arbre fg = consa(3,rac_g,rac_d);
    arbre fd = consa(6,arbre_vide,rac_d_d);

    arbre sommet = consa(5,fg,fd);

    printf("\nEn ordre infixe : ");
    infixe(sommet);

    printf("\nEn ordre prefixe : ");
    prefixe(sommet);
    printf("\nEn ordre postfixe : ");
    postfixe(sommet);


    printf("\nNombre de noeuds dans cette arbre : %d\n", nbrTotalNoeuds(sommet));
    printf("Nombre de noeuds a 2 fils : %d\n", nbreNoeudsDe2Fils(sommet));
    printf("Nombre de noeuds a 1 fils : %d\n", nbreNoeudsDe1Fils(sommet));

    // destructAbr(sommet);

    return 0;
}

1 个答案:

答案 0 :(得分:2)

  arbre N = malloc ( sizeof( arbre ) ) ;

不执行您期望的操作。它仅为指针分配内存,而不为指针指向的内存分配内存。

  arbre N = malloc(sizeof *N);

相反。


我不明白为什么要为同一件事或多或少定义三个名称。我的建议是删除abrarbre,仅使用struct aastruct aa *

更少的名称,更少的混乱,更少的错误。