L'allocation dynamique - C - Programmation
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
[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 )
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 :
|
skurlat a écrit : ageAmis est tout simplement de type int |
ageAmis est de type int*
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 ??
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 ), 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.
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+,
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....
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+,
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 ?
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 ...! |
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
Marsh Posté le 23-04-2010 à 09:52:31
fchack a écrit : |
IUT GEII à Tours de 1997 à 1999.
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?