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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
|
#include <stdio.h> // ok linux et windows
#include <stdlib.h> //
#include <time.h> //
#include <string.h>
int main()
{
int nbre_personnes, i = 0;
char **ptr_prenom_personnes = NULL;
int *ptr_age_personnes = NULL;
printf("\n Combien de personnes sont ici présentes ? ");
scanf("%d", &nbre_personnes);
ptr_prenom_personnes = malloc(nbre_personnes * sizeof(char*));
ptr_age_personnes = malloc(nbre_personnes * sizeof(int));
if (ptr_prenom_personnes == NULL && ptr_age_personnes == NULL) // Si ptr_prenom_personnes est ok mais que ptr_age_personnes est NULL alors fuites mémoires puisque que tu quittes sans faire un free de ptr_prenom_personnes.
Je rajoute après un nouveau EDIT, que ton && (et puis) aussi ne va pas, pour ce que tu voulais faire, sa aurait du être || (ou bien)
{
return EXIT_FAILURE;
}
for (i = 0; i < nbre_personnes ; i++)
{
ptr_prenom_personnes[i] = malloc(sizeof(*ptr_prenom_personnes[i])); // Ici faut que tu saches que le nombre de caractères que tu autorises est max 7 + 1 de fin de chaines. Pourquoi ?
Parce que tu fais un sizeof sur un pointeur est que celui-ci fera sur un ordi 64 bits 8 octets,
et si tu es sur du 32 bits alors tu auras droit à 4 octets pour le pointeur. Mais si on dépasse ce nombre de caractères, BOOM écriture dans une
zone mémoire pouvant être alloués à un autre programme. SEGMENTATION FAULT
if (ptr_prenom_personnes[i] == NULL) // vérification de l'allocation de mémoire, est-ce correct ? Oui, mais non en faites, pourquoi ? fuites mémoires, on ne quitte pas un programmes sans libérer les zones précédemment allouées. C'est juste une question d'organisation du code qui fait que tu en es là, mais sa va beaucoup mieux qu'avant
{
return EXIT_FAILURE;
}
printf("\n Quel est le prénom de la personne %i ? ", i + 1);
scanf("%s", ptr_prenom_personnes[i]);
}
for (i = 0; i < nbre_personnes ; i++)
{
printf("\n Quel âge a %s ? ", ptr_prenom_personnes[i]);
scanf("%d", &ptr_age_personnes[i]);
}
for (i = 0; i < nbre_personnes ; i++)
{
printf("\n %s a %d an%c ", ptr_prenom_personnes[i], ptr_age_personnes[i], ptr_age_personnes[i] > 1 ? 's' : ' ');
}
// libération de la mémoire allouée ci-après
for (i = 0; i < nbre_personnes; i++)
{
free(ptr_prenom_personnes[i]); // libération de tous les prénoms renseignés
}
free(ptr_prenom_personnes);
free(ptr_age_personnes);
printf("\n");
return EXIT_SUCCESS;
} |
Partager