IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Tableau et Malloc


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 29
    Points : 21
    Points
    21
    Par défaut Tableau et Malloc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    // fonction qui créé le tableau 2 D
    float** alloc2d(unsigned int nbligne , unsigned int nbcolonne)
    {
        float **tab;
        unsigned int i,j;
        if ((nbligne==00) || (nbcolonne==0))
        {
            tab=NULL;
        }
        else
        {
            tab=(float **)malloc(nbligne*sizeof(float *));
            for(i=0; i<nbligne; i++)
            {
                tab[i]=(float *)malloc(nbcolonne*sizeof(float));
                if(tab[i]== NULL)
                {
                    //la création du tableau à échoué je dois libérer la mémoire
                    for(j=0; j<i; j++)
                    {
                        free(tab[j]);
                    }
                    tab=NULL;
                }
            }
        }
        return tab;
    }
     
    //programme principal
    int main()
    {
        int lig,col;
        float ** tableau;
        lig=200000;
        col=200000;
        tableau=alloc2d(lig,col);
        if (tableau==NULL)
        {
            printf("tableau non crée de taille %d %d \n",lig,col);
        }
        return 0;
    }
    Bonjour,
    Comme le tableau est trop grand, j'ai une erreur de segmentation, j'aimerais qu'il m'affiche "tableau non crée de taille ...."

    Yann

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    .
    Inscrit en
    Décembre 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Fidji

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Décembre 2009
    Messages : 35
    Points : 38
    Points
    38
    Par défaut
    Ton alloc est mostrueusement grande :s

    Je viens de tester, en mettant 20

    Et il n'y a plus de segfault.

  3. #3
    Membre éclairé
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Points : 842
    Points
    842
    Par défaut
    Tu ne testes pas le retour de ton malloc. L'erreur vient peut-être d'ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab=(float **)malloc(nbligne*sizeof(float *));

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    .
    Inscrit en
    Décembre 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Fidji

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Décembre 2009
    Messages : 35
    Points : 38
    Points
    38
    Par défaut
    j unsigned int 913
    i unsigned int 914
    tab float ** (float **) 0x0
    Il faut verifier le malloc apres la la condition for

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
          for(i=0; i<nbligne; i++)
            {
              if (tab == NULL)
                exit(EXIT_FAILURE);
    Pourquoi apres, depassement de la pile d'execution je pense.

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 402
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 402
    Points : 23 785
    Points
    23 785
    Par défaut
    Bonjour,

    Citation Envoyé par Yann_br Voir le message
    [code=C]

    tab=(float **)malloc(nbligne*sizeof(float *));
    for(i=0; i<nbligne; i++)
    {
    tab[i]=(float *)malloc(nbcolonne*sizeof(float));
    if(tab[i]== NULL)
    Tu testes bien la valeur de retour de tes « sous malloc() » mais pas celle du malloc() principal en début de fonction. Si ton allocation échoue, tu vas provoquer une segfault avant même d'avoir pu remonter jusqu'à main().

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 29
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par Damoun Voir le message
    Ton alloc est mostrueusement grande :s

    Je viens de tester, en mettant 20

    Et il n'y a plus de segfault.
    je sais bien que Alloc2d fonctionne mais je dois traiter tous les type d'appel qui peuvent poser problèmes.
    alloc2d(0,10) traité
    alloc2d(10,0) traité
    alloc2d(100000,100000) segmentation fault
    Yann

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    .
    Inscrit en
    Décembre 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Fidji

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Décembre 2009
    Messages : 35
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par Damoun Voir le message
    Il faut verifier le malloc apres la la condition for

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
          for(i=0; i<nbligne; i++)
            {
              if (tab == NULL)
                exit(EXIT_FAILURE);
    Pourquoi apres, depassement de la pile d'execution je pense.
    Ma deuxiemme reponse dois regler sa
    Bien sur pour ton cas, tu ne fais pas exit, mais renvois NULL.

    Avec cette grosse alloc tu fais une stack overflow.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 29
    Points : 21
    Points
    21
    Par défaut
    Après correction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    float** alloc2d(unsigned int nbligne , unsigned int nbcolonne)
    {
        float **tab;
        unsigned int i,j;
        if ((nbligne==00) || (nbcolonne==0))
        {
            tab=NULL;
        }
        else
        {
            tab=(float **)malloc(nbligne*sizeof(float *));
            for(i=0; i<nbligne; i++)
            {
                if (tab == NULL)
                    return NULL;
                tab[i]=(float *)malloc(nbcolonne*sizeof(float));
                if (tab[i]== NULL)
                {
                    //la creation du tableau à echoué je dois libérer la mémoire
                    for(j=0; j<i; j++)
                    {
                        free(tab[j]);
                    }
                    tab=NULL;
                }
            }
        }
        return tab;
    }
    Dans mon cas si cela plante pendant la création du tableau, comment être sur que la mémoire utilisé par le tableau est libéré.

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    .
    Inscrit en
    Décembre 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Fidji

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Décembre 2009
    Messages : 35
    Points : 38
    Points
    38
    Par défaut
    Euh bah, au lieu de ton return NULL, je pense a un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    float** alloc2d(unsigned int nbligne , unsigned int nbcolonne)
    {
        float **tab;
        unsigned int i,j;
        if ((nbligne==00) || (nbcolonne==0))
        {
            tab=NULL;
        }
        else
        {
            tab=(float **)malloc(nbligne*sizeof(float *));
            for(i=0; i<nbligne; i++)
            {
                if (tab != NULL)
                    tab[i]=(float *)malloc(nbcolonne*sizeof(float));
                if (tab == NULL || tab[i]== NULL)
                {
                    //la creation du tableau à echoué je dois libérer la mémoire
                    for(j=0; j<i; j++)
                    {
                        free(tab[j]);
                    }
                    tab=NULL;
                }
            }
        }
        return tab;
    }
    Mais pas sur, a tester (valgrind etc..)

  10. #10
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 402
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 402
    Points : 23 785
    Points
    23 785
    Par défaut
    Citation Envoyé par Yann_br Voir le message
    Dans mon cas si cela plante pendant la création du tableau, comment être sur que la mémoire utilisé par le tableau est libéré.
    En procédant exactement de la même manière que dans ta fonction alloc2d() : en vérifiant l'état des pointeurs.

    Quoi qu'il se soit passé au cours de ton programme, tu écris un dernier paragraphe en bas de ta fonction main() et tu examines le contenu du pointeur « tableau ». S'il est NULL, tu sors directement, sinon tu entres dans un bloc, dans lequel tu commences par faire une boucle qui parcourt toutes les entrées de ton tableau et libère toutes celles qui ne sont pas NULL, elles non plus, et qui, à l'issue de cette boucle, fait de toutes façons un free() sur « tableau » puisque, dans ce bloc, on sait que celui-ci est défini.

Discussions similaires

  1. Allocation mémoire : tableau vs malloc
    Par scorbo dans le forum Débuter
    Réponses: 4
    Dernier message: 15/06/2007, 12h47
  2. malloc sur tableau de chaine
    Par ishikawa dans le forum C
    Réponses: 13
    Dernier message: 27/04/2007, 14h24
  3. malloc tableau 2D + fonction + main
    Par nicodn02 dans le forum C
    Réponses: 10
    Dernier message: 26/04/2007, 22h23
  4. Tableau à 2 dimensions avec utilisation de MALLOC
    Par johnalias110 dans le forum C
    Réponses: 3
    Dernier message: 28/02/2007, 18h54
  5. créer un tableau 2 dimensions avec Malloc
    Par nimportekoi dans le forum C
    Réponses: 14
    Dernier message: 15/11/2006, 13h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo