Pb d'allocation de memoire en C

salut à tous,
j'aimerai que vous m'aidiez a resoudre un problème d'allocation de memoire en C
le pb c'est dans une fonction ou je dois creer une nouvelle cellule pour travailler dessus

typedef struct cellule {
int val;
cellule next;
}*

fonction (){

cellule *NC = (cellule *)malloc(sizeof(cellule));
if(NC){
.
.
.
}

}
et ben ca ne veux pas marcher et ça retourne NULL a chaque fois alors le programme ne fait plus sont travail .

pourtant ca fonctionne très bien dans d'autre fonction d'allocation

je me demande si c'est parceque je ne fait pas la liberation de memoire a la fin , je ne sais pas si le la liberation peut ce fait toute seule ou pas a la sortie du programme

si quelqu'un peut m'aider svp j'en serai reconnaissant
Configuration: Windows Vista
Firefox 3.0.4

16 réponses

  • Votes
  • Date
  • Date décroissante
  1. Modérateur
    Salut,

    typedef struct cellule {
    int val;
    cellule next;
    }* 


    D'abord syntaxiquement c'est faux, l'étoile n'a rien à faire là.
    Ensuite c'est impossible que ce genre de truc puisse compiler, sinon ça signifie qu'il faudrait allouer récursivement de la mémoire à l'infini pour lui allouer de la mémoire.
    Corrige moi si je me trompe, mais je suppose que tu voulais faire un truc comme ça:
    struct __cellule {
        int val;
        struct __cellule *next;
    } cellule;

    1. salut kilan,
      pour la struct elle fausse t'a raison mais je l'est écrit juste comme exmple , j'ai fait la compilation du programme et résolu tout les erreur et maintenant je suis coinsé avec l'execution ,
      pour la structure je m'en fou ce qui m'interesse c'est la problème d'allocation en fait a chaque fois que j'execute le programme en mode debug il retourne null pour chaque allocation je ne sais pas ce qui lui arrive
      c'est comme il n'y avait plus de memoire pour l'allocation, exmple!:

      si je fait NC = (cellule*)malloc(sizeof(cellule)
      a l'execution NC vaut NULL;

      vous comprenez maintenant le problème ?

      je vais essayer de faire une allocation pour un caractère ou chaine de caractère pour comprendre plus d'ou vient le pb
      1. voila j'ai essayer ceci:
        s = (char *)malloc(sizeof(char)*100); //ici s=NULL
        s = "allocation reussi"; //ici s != NULL je crois que c'est normal puisque j'ai fait une allocation implicite avec
        printf("%s",s);
        1. Modérateur
          C'est vraiment bizzare ton truc. C'est sensé n'arriver que quand on n'a plus de mémoire.
      2. j'ai installé devC++ mais je ne sais pas comment faire le debug pas à pas comme en VS peut tu m'aider vite fait svp?
        1. Modérateur
          Je sais pas :-)
      3. bon alors puisqu'aucun ne peut m'aider comment peut on voir l'état de la memoire sous VS?
        1. j'ai rencontré une erreur lors de l'execution qui dit :
          Exception non gérée à 0x76e8d292 dans forum.exe : 0xC0000005: Violation d'accès lors de l'écriture à l'emplacement 0x00040f0c.

          qu'est ce que ça veut dire?
          1. Modérateur
            Exception non gérée à 0x76e8d292 dans forum.exe : 0xC0000005: Violation d'accès lors de l'écriture à l'emplacement 0x00040f0c.

            Ca veut dire que tu essaie d'écrire à un endroit de la mémoire qui ne t'appartient pas. En gros, tu écris sans doute dans un poitneur non alloué ou un dépassement de tableau, ou...
        2. c'est a cause de l'allocation de memoire qui retourne toujours NULL
          peut tu me dire si on peut voir l'état de la memoire en cours d'execution ou comment faire le vidage de memoire ou quelque soit qui peut me résoudre le pb?
          svp! j'en ai vraiment besoin pour continuer
          1. Rebootes ta machine et si c'est toujours pareil, envoie-nous tout le code à moins qu'il y en ait trop (et dans ce cas il faut le réduire et voir si le problème subsiste) et prière de ne pas oublier les balises sinon je ne regarde pas.
            1. d'accord merci
              mais dernière chose : par envoyer vous voulez dire par mail ou sur le forum?
              1. Modérateur
                Sur le forum, en utilisant les balises < code> </code> pour garder l'indentation.
            2. est ce qu'il y a une possibilité de vous l'envoyer par email?
              car c'est un projet à rendre et je ne veux le mettre en public sinon n'importe qui pourra le copier
              1. Il faudrait réduire le code au strict minimum, c'est-à-dire suffisamment pour que l'anomalie persiste et pour ne pas dévoiler ce qui ne doit pas l'être.
              2. @loupiussalut lupius,
                je crois savoir d'ou vient le pb en fait j'utilise un arbre n-aire avec les structure suivante:

                struct Noeud{ //liste des message
                char id[6];
                char id_parent[6];
                char id_subject[6];
                char id_user[21];
                char date[15];
                char content[201];
                struct Cellule * response;
                };
                typedef Noeud* Message;

                struct Cellule{ //arbre n-aire de reponse
                struct Noeud * message;
                struct Cellule * next;
                };
                typedef Cellule* Response;

                je pense que le pb vient d'ici :

                R = (Response)calloc(1,sizeof(Response));

                la premier fois ca passe sans erreur et la deuxième fois il retourne NULL
                qu'est ce que tu en dit ?
            3. Contributeur
              Salut
              Je n'ai pas tout lu. Mais n'aurais-tu pas oublié d'inclure stdlib.h ? (On ne sait jamais ^^).