Petite Question en C
Dernière réponse : dans Programmation
Hello tout le monde,
Je me remet tout doucement au C (merci pour ton conseil de compilateur Zeb
).
Je me fait des petits exos. Et la, je galère avec un pointure dans une structure.
Et je ne comprend pas pourquoi.
Le programme compile bien mais il plante à l'affichage de la chaine de caractère.
Une petite aide (surtout une explication sur mon erreur ) serait la bienvenue
Merci pour votre aide
Je me remet tout doucement au C (merci pour ton conseil de compilateur Zeb
).Je me fait des petits exos. Et la, je galère avec un pointure dans une structure.
Et je ne comprend pas pourquoi.
typedef struct perso {
int age;
char * nom;
int sexe;
}personne;
int main(void)
{
personne perso1;
perso1.age = 15;
perso1.nom = (char *) malloc(sizeof(char)* 20);
printf("nom :");
//strcpy(perso1.nom,"alfred");
scanf("%s", perso1.nom); // perso1.nom coorespond à l'adresse --> pas besoin de &
//*(perso1.nom) = getchar();
printf("voila le nom %s", *perso1.nom); // je sais pas si c'est correcte
.....
}
Le programme compile bien mais il plante à l'affichage de la chaine de caractère.
Une petite aide (surtout une explication sur mon erreur ) serait la bienvenue
Merci pour votre aide
Autres pages sur : petite question
Lassé par la pub ? Créez un compte
En fait, ce qu'il faut bien comprendre c'est quand C, les chaines de caractères n'existent pas vraiment... C'est géré comme des tableaux de char...
Quand tu ecris une chaine de caracteres avec une taille fixe :
Chaine est en fait un pointeur vers le premier element du tableau de char.
Là tu peux noté que le * n'est pas utilisé... Donc il en va de même qd tu gère la taille de ta chaine avec un malloc...
Voilà, j'espere que ca t'a aidé à mieux comprendre la problematique...
Quand tu ecris une chaine de caracteres avec une taille fixe :
char Chaine[15];
printf ("%s", Chaine);
Chaine est en fait un pointeur vers le premier element du tableau de char.
Là tu peux noté que le * n'est pas utilisé... Donc il en va de même qd tu gère la taille de ta chaine avec un malloc...
Voilà, j'espere que ca t'a aidé à mieux comprendre la problematique...
ftopaz a dit :
En fait, ce qu'il faut bien comprendre c'est quand C, les chaines de caractères n'existent pas vraiment... C'est géré comme des tableaux de char...Quand tu ecris une chaine de caracteres avec une taille fixe :
char Chaine[15];
printf ("%s", Chaine);
Chaine est en fait un pointeur vers le premier element du tableau de char.
Là tu peux noté que le * n'est pas utilisé... Donc il en va de même qd tu gère la taille de ta chaine avec un malloc...
Voilà, j'espere que ca t'a aidé à mieux comprendre la problematique...
Merci pour ton aide.
En gros, si j'ai bien compris pour une chaine de caractere, il faut :
char Chaine[15];
printf ("%s", Chaine);
Et si,je veux afficher que la premiere valeur
char Chaine[15];
printf ("%c", *Chaine); // ou printf ("%c", Chaine[0]);
c'est ça?
(pfff .. pas bon de faire du php, apres c'est dur de se remettre au C
)Ces deux lignes sont équivalentes. La différences, c'est où est allouée la mémoire (tas/pile) d'une part, et donc comment se fera la désallocation (automatique/free()).
char Chaine[15];
char *Chaine = malloc(15);
Pour printf(), scanf(), etc, elles sont rigoureusement identiques.
Si Chaine est un pointeur, *Chaine est le contenu du pointeur.
printf("%c", .. ) attent un caractère, pas un pointeur, il affiche donc *Chaine en considérant qu'il s'agit d'un caractère.
Regarde :
int chaine[1];
*chaine = 12345;
printf("%d", *chaine);
printf("%c", *chaine);
On a vu que pointeur et tableau sont proches parents. Mais dans ton exemple, puisque Chaine est un tableau, écris Chaine[0] plutôt que *Chaine.
(Au fait, quel compilo as-tu choisi ?)
zeb a dit :
Regarde :
int chaine[1];
*chaine = 12345;
printf("%d", *chaine);
printf("%c", *chaine);
On a vu que pointeur et tableau sont proches parents. Mais dans ton exemple, puisque Chaine est un tableau, écris Chaine[0] plutôt que *Chaine.
(Au fait, quel compilo as-tu choisi ?)
Merci, pour ton aide.
Par contre, cette ligne :
printf("%c", *chaine);
elle va affiché quoi? le caractère ASCII de 1234 (euuh ca existe?)? (au pire,j'essaierais ce soir)
Pour le compilo, j'ai choisi MinwG pour son interface simple (pas eut le courage d'utiliser cgwin et gcc).
int sur 4 octets (en 32 bits)
char sur 2 octets (en 32 bits) ...
chaine[6] :
----- ['c'|'o'|'u'|'c'|'o'|'u'|'\0']
| 100
|
[100|char] ------> <=> *chaine
3
*chaine est un pointeur de type char, qui pointe sur le premier élèment du tableau chaine
pour atteindre le deuxième élèment du tableau chaine avec un pointeur, tu fais *(chaine + 2) = *(chaine + sizeof(char*))
ou tu utilises la notion de tableau, comme chaine[3] = 'c', souviens toi que c'est gérer par des pointeurs derrière, comme la ligne au dessus.
Aprés tu utilses se que tu veux. Pour afficher toute ta chaine d'un coup, tu utilises %s, pour un seul caratère %c.
Si tu déclares un pointeur de type char, et que tu fais un malloc ou calloc :
Tu pourras utiliser ton pointeur de la même manière qu'un tableau, soit pointeur[15]. Ou l'utiliser avec les pointeurs comme expliqué au dessus.
Guich
char sur 2 octets (en 32 bits) ...
chaine[6] :
----- ['c'|'o'|'u'|'c'|'o'|'u'|'\0']
| 100
|
[100|char] ------> <=> *chaine
3
*chaine est un pointeur de type char, qui pointe sur le premier élèment du tableau chaine
pour atteindre le deuxième élèment du tableau chaine avec un pointeur, tu fais *(chaine + 2) = *(chaine + sizeof(char*))
ou tu utilises la notion de tableau, comme chaine[3] = 'c', souviens toi que c'est gérer par des pointeurs derrière, comme la ligne au dessus.
Aprés tu utilses se que tu veux. Pour afficher toute ta chaine d'un coup, tu utilises %s, pour un seul caratère %c.
Si tu déclares un pointeur de type char, et que tu fais un malloc ou calloc :
char *pointeur;
int taille = 15;
pointeur = (*char)malloc(taille * sizeof(char));
Tu pourras utiliser ton pointeur de la même manière qu'un tableau, soit pointeur[15]. Ou l'utiliser avec les pointeurs comme expliqué au dessus.
Guich
guillaumech a dit :
Me revoilà
, oui dsl, erreur de frappe, bien sûr qu'un char est codé sur 1 octet, et non 2, toutes mes excuses
et pour le sizeof(char*) aussi, mais la faute de frappe était évidente mon cher Zeb
ralala (tjs aussi exigent
)donc
*(chaine + 1) = *(chaine + sizeof(char*))
Pas grave, ca arrive (à force d'utiliser sizeof, on oublie
).je testerais tout cela ce soir.
Merci, pour votre aide ... grâce a vos exemples, ca m'aide a me remettre dans le bain
zeb a dit :
Non, Sisier, pas comme ça. Voilà le bon code :Citation :
*(chaine + 1) = *(chaine + sizeof(char))sizeof(char) == 1
sizeof(n'importequoi *) == sizeof(void *) == 16 bits sur un système 16 bits (*), 32 bits sur un système 32 bits, 64 bits sur un système 64 bits, etc.
(*) Pas de Linux 16bits bien sûr
Oui, je sais pas pourquoi j'avais mis ce char* .
Merci
Lassé par la pub ? Créez un compte
- Contenus similaires :
Tags :
- ForumPetite question de popup
- benchmarkPetite question sur lynx
- ForumPetite question gps
- articlesPetite question sur xen
- ForumPetite question sur la playstation 1
- ForumPetite question sur la ps3
- ForumPetite question ethernet
- ForumPetite question sur targa
- ForumPetite question sur norton
- ForumPetite question sur dreamweaver
- Voir plus