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 :

allocation de memoire avec calloc()


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 317
    Par défaut allocation de memoire avec calloc()
    bonjour les amis,
    en utilisant l'allocation dynamique avec la fonction calloc(),mais en libérant la mémoire j'ai un problème de compilation dans mon programme et il se bloque.
    voici un extrait de mon code d'une allocation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     char *buffer12=NULL;
    buffer12 = calloc(i+1,kgram);
    et à la fin du programme en libérant le buffer12: voici le message d'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    |173|error: 'buffer12' undeclared (first use in this function)
     each undeclared identifier is reported only once for each function it appears in|
    est-ce que vous avez une solution pour libérer la mémoire!??
    merci

  2. #2
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Euuh....
    buffer12... il est déclaré dans le scope local où tu free ?

    Tu peux montrer le code avec le malloc et le free ?
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  3. #3
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 317
    Par défaut
    je n'ai pas fais avec malloc juste avec calloc().
    selon vous est-ce que la mémoire se libère automatique si j'écris pas free???

  4. #4
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Non....
    Le processus une fois fini va certe libérer tout le mapping...
    Mais tant que tu seras dans ton programme, la mémoire ne sera PAS libérée.
    Les leaks resteront !

    Et que ça soit malloc ou calloc : vérifies que ta variable buffer12 soit déclarée partout, et qu'elle contienne BIEN la bonne valeur...................
    Bref : montre ton code
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  5. #5
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 317
    Par défaut
    voici mon code sans les déclarations initiales!!
    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
    char *buffer12=NULL;
    for(i=1;i<=longseq-k;i++){
    u++;
    printf ("U : %d\n",u);
     
         buffer12 = calloc(i+1,k);
    strncpy(buffer12,sequence+i,k);
     printf("\nle buffer12 :       %s \n",buffer12);
    lamda=0;verif=0;
    while((lamda<u)){
          X=strcmp(tab[lamda],buffer12);
           if(X==0){
                verif++;
    }        lamda++;
            }
    printf("VERRIFF  %d \n",verif);
    if (verif==0){
             tab[u]=buffer12;
            printf("\ntab[%d] est:  %s \n\n\n",u,tab[u]);
    }else u--;
    free(buffer12);
        return 0;
    } // du main

  6. #6
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Si ce code se trouve ainsi dans UNE fonction :

    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
     
    char *buffer12 = NULL;
     
    for (i = 1; i <= longseq - k; i++)
    {
    	u++;
    	printf ("U : %d\n", u);
    	buffer12 = calloc(i + 1, k);
    	strncpy(buffer12, sequence + i, k);
    	printf("\nle buffer12 :       %s \n", buffer12);
    	lamda = 0;
    	verif = 0;
    	while (lamda < u)
    	{
    		X = strcmp(tab[lamda], buffer12);
    		if (X == 0)
    		{
    			verif++;
    		}
    		lamda++;
    	}
    	printf("VERRIFF  %d \n", verif);
    	if (verif == 0)
    	{
    		tab[u] = buffer12;
    		printf("\ntab[%d] est:  %s \n\n\n", u, tab[u]);
    	}
    	else
    		u--;
    	free(buffer12);
        return 0;
    } // du main
    Alors tu ne peux pas avoir d'erreur.

    L'erreur que tu as proviens du fait que tu aurais 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
     
    int func1(size_t i, size_t j)
    {
    char *buffer12;
     
    buffer12 = calloc(i,j);
    return (42);
    }
     
    int func2(size_t i)
    {
    free(buffer12);
    return (1337);
    }
    CAD la variable "buffer12" non déclarée dans la 2e fonction...
    Ou alors tu déclares tes variables dans des scopes différents comme ça :

    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
     
    void func3(size_t i, size_t j)
    {
     int var;
     
     for (var = 0; var != 666; var++)
     {
       char *buffer12;
       buffer12 = calloc(i,j);
     }
     
     for (var = 0; var != 666; var++)
     {
       free(buffer12);
     }
     
    }
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

Discussions similaires

  1. Réponses: 3
    Dernier message: 17/01/2011, 18h26
  2. Problem avec JOGL et allocation de memoire.
    Par goast dans le forum 3D
    Réponses: 1
    Dernier message: 13/02/2009, 20h18
  3. Allocation Dynamique de Memoire Avec Operateur New
    Par msstaf dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/06/2006, 15h49
  4. Allocation de memoire
    Par zakjo_developper dans le forum C
    Réponses: 16
    Dernier message: 08/04/2005, 13h46
  5. char * et Allocation de memoire
    Par venomelektro dans le forum C++
    Réponses: 3
    Dernier message: 14/10/2004, 13h24

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