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 :

question pointeur et calloc


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7
    Par défaut question pointeur et calloc
    Bonjour,
    voici mon petit programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void callocInt(int* point) {
    	point = (int*) calloc(2,1);
    }
     
    int main (int argc, char * const argv[]) {
     
    	int* intPoint = NULL;
    	callocInt(intPoint);
    	printf("%d\n", intPoint);
    }
    Le print me rend zéro, comme si le pointeur n'avait pas subi l'allocation.

    Voyez-vous pourquoi ?

    merci beaucoup

  2. #2
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    main.c||In function 'main'
    main.c|13|warning: format '%d' expects type 'int', but argument 2 has type 'int *'
    main.c|9|warning: unused parameter 'argc'
    main.c|9|warning: unused parameter 'argv'
    main.c|14|warning: control reaches end of non-void function
    ||=== Build finished: 0 errors, 4 warnings ===|
    Bon, y'a du travail la ^^

    Alors, si tu utilise pas argc ni argv, mets void en parametre du main.
    Mets return EXIT_SUCCESS; a la fin du main

    <edit> : si tu veux afficher l'adresse de ta variable, utilise %p et pas %d </edit>

    voici un indice de pourquoi ca plante

    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
     
    #include <stdlib.h>
    #include <stdio.h>
     
     
    void callocInt(int* point)
    {
    	point = (int*) calloc(2,1);
    	if (point == NULL)
        {
            perror ("Erreur lors du calloc");
            exit (EXIT_FAILURE);
        }
        printf("intPoint pendant : %p\n", point);
    }
     
    int main (void)
    {
     
    	int* intPoint = NULL;
     
    	printf("intPoint avant : %p\n", intPoint);
    	callocInt(intPoint);
    	printf("intPoint apres : %p\n", intPoint);
     
    	return EXIT_SUCCESS;
    }

    Et oui, tu passe une COPIE de ton pointeur. C'est donc ta copie qui subie le calloc, et non le pointeur du main.

    Deux soluce :

    soit tu passe un pointeur de pointeur :

    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
     
    #include <stdlib.h>
    #include <stdio.h>
     
     
    void callocInt(int* *point)
    {
    	(*point) = (int*) calloc(2,1);
    	if ((*point) == NULL)
        {
            perror ("Erreur lors du calloc");
            exit (EXIT_FAILURE);
        }
        printf("intPoint pendant : %p\n", (*point));
    }
     
    int main (void)
    {
     
    	int* intPoint = NULL;
     
    	printf("intPoint avant : %p\n", intPoint);
    	callocInt(&intPoint);
    	printf("intPoint apres : %p\n", intPoint);
     
    	return EXIT_SUCCESS;
    }

    soit tu renvoi l'adresse

    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
     
    #include <stdlib.h>
    #include <stdio.h>
     
     
    int* callocInt(void)
    {
    	int* point = (int*) calloc(2,1);
    	if (point == NULL)
        {
            perror ("Erreur lors du calloc");
            exit (EXIT_FAILURE);
        }
        printf("intPoint pendant : %p\n", point);
     
        return point;
    }
     
    int main (void)
    {
     
    	int* intPoint = NULL;
     
    	printf("intPoint avant : %p\n", intPoint);
    	intPoint = callocInt();
    	printf("intPoint apres : %p\n", intPoint);
     
    	return EXIT_SUCCESS;
    }
    voila ^^

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7
    Par défaut
    Merci infiniement

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    J'ai vu que le problème était résolu, mais je voudrais y apporter un petit complément.
    Les fonctions malloc() et calloc() sont des fonctions de base. Elle sont complètes en elles-mêmes, ce qui fait qu'il faut une bonne raison pour créer une fonction qui ne fasse que faire un malloc() ou un calloc().
    Pour que l'on puisse mieux l'aider, DJM400 devrait nous dire la raison de création de cette callonInt().
    Le premier paramètre de l'appel de calloc() est 2, le second est 1.
    Cette fonction aurait été (presque) utile si le nombre de valeurs à allouer avait été précisé, par exemple NbPt. L'appel de calloc aurait été
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     point = calloc(sizeof(int), NbPt);
    En effet, rien ne dit que un int a toujours une longueur de 2 octets.

    Un autre point me parait important. La fonction calloc() alloue de la mémoire. Il est indispensable de la libérer avec free() lorsqu'elle n'est plus utile.
    Une bonne pratique consiste à libérer la mémoire au même niveau qu'on l'a allouée.
    Voila comment j'aurais écrit ce programme:
    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
    #include <stdlib.h>
    #include <stdio.h>
     
    int UnTraitement(int NbPt)
    {
    	int* point = (int*) calloc(sizeof(int),NbPt);
    	if (point == NULL)
           {
              perror ("Erreur lors du calloc");
              return -1;
            }
            printf("intPoint pendant : %p\n", point);
    ...
    // là on fait le traitement voulu
    ...
        free (point); 
        return 1;  // cad ça a marché
    }
    int main (void)
    {
            int NbPt=12; // par exemple 
            int ret;
    	ret = UnTraitement(NbPt);
            if (ret == -1) return EXIT_FAILURE;
            else
    	  printf("Traitement terminé avec succès\n");
     
    	return EXIT_SUCCESS;
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Petite question pointeurs Delphi
    Par peter27x dans le forum Langage
    Réponses: 4
    Dernier message: 06/01/2009, 15h57
  2. question pointeur
    Par Burinho dans le forum C
    Réponses: 20
    Dernier message: 14/01/2006, 09h51
  3. Question sur les pointeurs.
    Par Chrisemi dans le forum C++
    Réponses: 5
    Dernier message: 28/10/2005, 23h47
  4. Question de pointeur entre un programme et une DLL
    Par Neilos dans le forum C++Builder
    Réponses: 12
    Dernier message: 01/02/2005, 19h12
  5. questions sur les pointeurs
    Par Hyoga dans le forum C++
    Réponses: 17
    Dernier message: 08/01/2005, 23h25

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