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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    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
    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
    Membre averti
    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
    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 émérite
    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
    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
    Membre averti
    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
    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
    Membre averti
    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
    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.

  6. #6
    Membre averti
    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
    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é.

  7. #7
    Membre averti
    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
    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

  8. #8
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 474
    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().

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