Allocation dynamique d'un tableau char |
Bienvenue invité ( Connexion | Inscription )
Allocation dynamique d'un tableau char |
30 Dec 2014, 12:48
Message
#1
|
|
Macbidouilleur de bronze ! Groupe : Membres Messages : 336 Inscrit : 25 Sep 2004 Lieu : Occitanie Membre no 24 178 |
Bonjour
J'en suis à l'allocation dynamique d'un tableau, mais j'ai un petit soucis qui est le suivant : Je rentre le nombre d'amis (ex : 2), puis leur âge et ensuite leur nom jusque là tout va bien, mais c'est lors de l'affichage que ça coince. Exemple : amis n°1 : âge 18, nom : Pierre; amis n° 2 : âge 20, nom : Alain, A l'affichage j'obtiens : PAlain est né en.... Alain est né en .... Comment fait-on pour allouer de la mémoire pour la longueur du nom ? Car je pense que c'est à ce niveau là qu'il a un problème. Merci. Je précise que je débute en C et que ceci est un exemple de programmation pour appréhender l'allocation dynamique. Code #include <stdio.h>
#include <stdlib.h> int main(int argc, const char * argv[]) { int nombreAmis = 0, i = 0; int *ageAmis = NULL; char *nomAmis = NULL; printf("Combien d'amis avez-vous ? "); scanf("%d", &nombreAmis); if (nombreAmis > 0) { ageAmis = malloc(nombreAmis *sizeof(int)); nomAmis = malloc(nombreAmis *sizeof(int)); if (ageAmis == NULL) { exit(0); } for (i = 0; i < nombreAmis; i++) { printf("Quel âge à l'ami numéro %d ? ", i + 1); scanf("%d", &ageAmis[i]); printf("Quel est son nom ? "); scanf("%s", &nomAmis[i]); } printf("\n\nDates de naissance de vos amis :\n"); for (i = 0; i < nombreAmis; i++) { printf("%s est n(é) en %d\n", &nomAmis[i], 2014 - ageAmis[i]); } free(ageAmis); free(nomAmis); } return 0; } -------------------- MAC PRO 2009 (MAC OS 10.14.6) 2 x 3,33 Ghz 6-CoreIntel Xeon(5.1), , 64 Go.Carte graphique NVIDIA GeForce GTX 680.
Mac Studio M2 Max, 32Go, 1To |
|
|
30 Dec 2014, 15:56
Message
#2
|
|
Terminaltor Moderating Machine Groupe : Admin Messages : 24 449 Inscrit : 25 Oct 2002 Lieu : Jeumont (59) Membre no 4 319 |
nomAmis doit être un char **
son allocation doit être un malloc(nombreAmis * sizeof(char*)) Ensuite, chaque élément du tableau doit lui même être alloué avec un malloc(taillMax * sizeof(char)) Il ne faut jamais faire un scanf("%s") car c’est un excellent moyen d’offrir un buffer overflow ; il faut fournir la taille maximale : scanf("%1024s") par exemple. J’ai bien peur en voyant ce code que les tableaux, censés être maîtrisés nettement avant l’allocation dynamique, ne le soient pas. -------------------- I think therefore I Mac
|
|
|
30 Dec 2014, 16:24
Message
#3
|
|
Macbidouilleur de vermeil ! Groupe : Membres Messages : 1 198 Inscrit : 8 Oct 2003 Membre no 10 220 |
Salut,
Il te faut allouer un tableau de pointeurs: char **nomAmis = malloc(nombreAmis *sizeof(char*)); ensuite, il faudra allouer une chaine pour le nom de chaque ami et l'affecter à un élément du tableau: Code // dans la boucle d'amis char* nom=malloc(40+1); // longueur 40 caracteres max + zéro terminal scanf("%40s",nom); // limite la saisie à 40 cars nomAmis[i]=nom; à la fin faire un free sur tous les éléments du tableau et enfin sur le tableau lui-même (nomAmis) Une solution alternative serait d'utiliser un pointeur sur un tableau de chars: char (*nomAmis)[41]=malloc(41*nombreAmis); ici, il n'y a pas d'allocation à faire, l'espace est déjà réservé pour chaque nom: scanf("%40s",nomAmis[i]); |
|
|
30 Dec 2014, 16:38
Message
#4
|
|
Macbidouilleur de bronze ! Groupe : Membres Messages : 336 Inscrit : 25 Sep 2004 Lieu : Occitanie Membre no 24 178 |
Je vous remercie pour toutes ces précisions. Je vois donc que j'ai encore pas mal de boulot à faire avant de maitriser le C.
-------------------- MAC PRO 2009 (MAC OS 10.14.6) 2 x 3,33 Ghz 6-CoreIntel Xeon(5.1), , 64 Go.Carte graphique NVIDIA GeForce GTX 680.
Mac Studio M2 Max, 32Go, 1To |
|
|
Nous sommes le : 26th April 2024 - 04:23 |