L'allocation dynamique

L'allocation dynamique - C - Programmation

Marsh Posté le 21-04-2010 à 22:37:09    

Bonsoir a tous  :)  
 
Avec ce code qui se trouve dans le chapitre "L'allocation dynamique" , j'ai voulu entrer les noms des Amis au lieu des ages mais ça plante a chaque fois.. avez des indices a me donner?
 

Code :
  1. int main(int argc, char *argv[])
  2. {
  3.     int nombreDAmis = 0, i = 0;
  4.     int* ageAmis = NULL;
  5.     printf("Combien d'amis avez-vous ? " );
  6.     scanf("%d", &nombreDAmis);
  7.     if (nombreDAmis > 0)
  8.     {
  9.         ageAmis = malloc(nombreDAmis * sizeof(int));
  10.         if (ageAmis == NULL)
  11.         {
  12.             exit(0);
  13.         }
  14.      
  15.         for (i = 0 ; i < nombreDAmis ; i++)
  16.         {
  17.             printf("Quel age a l'ami numero %d ? ", i + 1);
  18.             scanf("%d", &ageAmis[i]);
  19.         }
  20.    
  21.         printf("\n\nVos amis ont les ages suivants :\n" );
  22.         for (i = 0 ; i < nombreDAmis ; i++)
  23.         {
  24.             printf("%d ans\n", ageAmis[i]);
  25.         }
  26.      
  27.         free(ageAmis);
  28.     }
  29.     return 0;
  30. }

Reply

Marsh Posté le 21-04-2010 à 22:37:09   

Reply

Marsh Posté le 21-04-2010 à 23:33:09    

Si mes souvenirs sont bons :
 
ageAmis est tout simplement de type int, hors le nom de tes amis est une chaine de caractères, donc forcément ca marche pas top :D
 
[EDIT] En réalité ageAmis est un pointeur vers un tableau d'entiers et non pas un entier.
 
Enfin certains te l'expliqueront mieux que moi, ca commence à dater de mon côté (sans avoir été très poussé en plus  :D )

Message cité 1 fois
Message édité par skurlat le 21-04-2010 à 23:35:11
Reply

Marsh Posté le 22-04-2010 à 01:01:25    

lassault1 a écrit :

Avec ce code qui se trouve dans le chapitre "L'allocation dynamique" , j'ai voulu entrer les noms des Amis au lieu des ages mais ça plante a chaque fois.. avez des indices a me donner?


bien sûr que ton code actuelle ne marchera pas si tu saisi des noms a la places d'ages.
pour avoir plusieurs noms tu dois (par exemple) allouer une matrice. tu met donc un nom par ligne.
 
le code peut donc devenir quelque chose comme :

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define TAILLE_MAX_NOM 20
  4. int main(int argc, char  *argv[])
  5. {
  6.     int nombreDAmis = 0, i = 0;
  7.     char** ageAmis = NULL;
  8.     printf("Combien d'amis avez-vous ? " );
  9.     scanf("%d", &nombreDAmis);
  10.     if (nombreDAmis > 0)
  11.     {
  12.         /* Allocation matrice ==> allocation vecteur de
  13.            nombreDAmis cases, puis pour chaque case
  14.            allocation d'un vecteur de TAILLE_MAX_NOM cases */
  15.         ageAmis = malloc(nombreDAmis * sizeof (char*));
  16.         for (i = 0; i < nombreDAmis; i++)
  17.             ageAmis[i] = malloc (sizeof (char) * TAILLE_MAX_NOM);
  18.         if (ageAmis == NULL)
  19.         {
  20.             exit(0);
  21.         }
  22.         for (i = 0 ; i < nombreDAmis ; i++)
  23.         {
  24.             printf("Quel age a l'ami numero %d ? ", i + 1);
  25.             scanf("%s", ageAmis[i]);
  26.         }
  27.         printf("\n\nVos amis ont les ages suivants :\n" );
  28.         for (i = 0 ; i < nombreDAmis ; i++)
  29.         {
  30.             printf("%s\n", ageAmis[i]);
  31.         }
  32.         free(ageAmis);
  33.         /* Liberer l'espace de la matrice alloue */
  34.         for (i = 0; i < nombreDAmis; i++)
  35.             free(ageAmis[i]), ageAmis[i] = NULL;
  36.         free(ageAmis), ageAmis = NULL;
  37.     }
  38.     return 0;
  39. }


 

skurlat a écrit :

ageAmis est tout simplement de type int


ageAmis est de type int* ;)

Reply

Marsh Posté le 22-04-2010 à 12:02:29    

merci..
 
Ce que je comprends pas c'est que pour chaque élément du tableau ( ageAmis[i])  qui ont un octet chacun tu alloue de 20 octets ...!
 
Est ce possible pour un élément de 1 octet d'allouer 20 octets ??

Reply

Marsh Posté le 22-04-2010 à 14:15:36    

ageAmis[] n'est pas 1 octet mais un tableau de pointeurs pointant vers des chaînes de caractères. Du reste, le nom ageAmis est mal choisi puisqu'il contient non plus des âges mes des noms :/
 
lassault1, ça fait je sais pas combien de topics sur le C que tu ouvres pour poser des questions franchement trivial dès lors qu'on a pris le temps de lire un bon bouquin sur le C. Alors tu voudrais nous lâcher un peu et passer qq jours à lire ton bouquin sur le C, faire des exo et quand tu commencera à faire des programmes, revenir ici pour nous poser de vraies questions? Surtout que sur internet, y'a quand même beaucoup de site qui donne les bases sur le C, donc largement de quoi t'aider à répondre à tes questions. Le C, c'est pas évident quand on débute (et même après :D), mais là, je trouve que tu fais pas beaucoup d'efforts pour comprendre par toi-même. Tu me fais penser à qq étudiants de ma classe quand j'étais à l'IUT et qui disaient toujours "De toute manière, je comprends rien au c!" sans avoir ouvert leur cours ou avoir cherché à comprendre qq minutes.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 22-04-2010 à 15:14:32    

Citation :

ageAmis = malloc(nombreDAmis * sizeof(int));


La tu alloues de la place pour nombreDAmis entiers, place que tu remplis ici:
         for (i = 0 ; i < nombreDAmis ; i++)
         {
             printf("Quel age a l'ami numero %d ? ", i + 1);
             scanf("%s", ageAmis[i]);
         }
Comme tu as alloué un pointeur, tu aurais aussi pu faire:
int *p = ageAmis; // p pointe sur la même zone que ageAmis
         for (i = 0 ; i < nombreDAmis ; i++)
         {
             printf("Quel age a l'ami numero %d ? ", i + 1);
             scanf("%s", p++);
         }
Tu comprends bien que des chaines de caractères, c'est en général bien plus grand que des entiers. Ca va donc pas avoir assez de place pour tenir dans la place que tu avais alloué pour les entiers.
 

Citation :

Ce que je comprends pas c'est que pour chaque élément du tableau ( ageAmis[i])  qui ont un octet chacun tu alloue de 20 octets


Il a écrit:
ageAmis = malloc(nombreDAmis * sizeof  (char*));
Donc la il alloue un pointeur sur nombreDAmis char*, c'est a dire qu'il alloue de la place mémoire pour nombreDAmis pointeurs sur des chaines de caractères, qui vont être les noms.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 22-04-2010 à 17:51:35    

rufo c'est pas gentil ce que tu dis... car je suis sur le forum pour progresser..

 

J'ai jamais dis que ageAmis[] est un octet...  j'ai plutôt dis que ageAmis[i] est un octet car c'est une variable de type char....

Message cité 1 fois
Message édité par lassault1 le 22-04-2010 à 18:25:14
Reply

Marsh Posté le 22-04-2010 à 18:51:59    

Si tu lisais ce que je t'ai mis en gras, tu saurais que c'est une variable de type char*
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 23-04-2010 à 02:29:08    

rufo a écrit :

Tu me fais penser à qq étudiants de ma classe quand j'étais à l'IUT et qui disaient toujours "De toute manière, je comprends rien au c!" sans avoir ouvert leur cours ou avoir cherché à comprendre qq minutes.


question à part: juste par curiosité, je peux savoir quel IUT de quel université de quel formation stp ? :p

Reply

Marsh Posté le 23-04-2010 à 02:41:13    

lassault1 a écrit :

J'ai jamais dis que ageAmis[] est un octet...  j'ai plutôt dis que ageAmis[i] est un octet car c'est une variable de type char....


on vas parler avec des mots simplifier pour que tu comprenne.
ageAmis[i] est de type char* pas char. c'est un pointeur vers une chaine de caractère.
ce que je t'ai mis dans le code, c'est une allocation d'un tableau de pointeurs:
ageAmis = malloc(nombreDAmis * sizeof  (char*));
chaque case du tableau c'est a dire chaque pointeur (qui est de type char* et qui est donc de taille sizeof(char*)) pointe vers une chaine de caractère de taille 20*sizeof (char) donc "disons" 20 octet ...

 
lassault1 a écrit :

Ce que je comprends pas c'est que pour chaque élément du tableau ( ageAmis[i])  qui ont un octet chacun tu alloue de 20 octets ...!
Est ce possible pour un élément de 1 octet d'allouer 20 octets ??


il faut dire plutôt que "chaque élément du tableau (ageAmis[i]) pointe vers une chaine de 20 octets" c'est a dire qu'il contiens l'adresse de début de la chaine; et pour ça sizeof(char*) est suffisant (la taille alloué pour chaque élément du tableau).

 

c'est une façon simple pour allouer de l'espace pour une matrice, dynamiquement ... après faut bien connaitre les bases (notamment les pointeurs) pour mieux comprendre

 


Message édité par fchack le 23-04-2010 à 02:50:46
Reply

Marsh Posté le 23-04-2010 à 02:41:13   

Reply

Marsh Posté le 23-04-2010 à 09:52:31    

fchack a écrit :


question à part: juste par curiosité, je peux savoir quel IUT de quel université de quel formation stp ? :p


 
IUT GEII à Tours de 1997 à 1999.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed