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.
Code :
typedefstruct 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
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()).
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 :
Code :
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.
euuh je dirais :
int = 2 octet.
char = 1 octet
small et big endian .. c'est pareil que gros boutiste et petit boutiste : la façon dont les octects sont lus.
Donc ca va dépendre, quel octet va etre lu en premier et va donc etre traduit si je comprend bien.
*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 :
Code :
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.
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 )
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
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.