Initiation d'un pointeur

Fermé
ygj Messages postés 65 Date d'inscription dimanche 1 février 2009 Statut Membre Dernière intervention 29 décembre 2021 - Modifié par ygj le 24/01/2015 à 21:49
 ygj - 30 janv. 2015 à 17:06
Bonjour,
j'ai un petit problème à comprendre quelques instructions (6 & 7), dans le code suivant:

#include <stdio.h>
#include<string.h>
#include<stdlib.h>
char * concat ( char * destination, const char * source )
{
      char * P = destination + strlen(destination) ;
        while (*source) *P++ = *source++ ;
            *P = '\0';printf("%s",destination);
return destination ;
}
void main()
{
 char * ch1="bon";
 char * ch2="jour";
 concat ( ch1,ch2 );
 printf("%s",ch1);
 
}

D'après mes connaissances:

1) pour
char * P = destination + strlen(destination) ;

p est un pointeur de type chaine.
desitination renvoi l'adresse du premier caractère.
strlen(destination) renvoi la longueur de la chaine dans destination.
comment ça se fait adresse+longueur dans pointeur?

2) pour
while (*source) *P++ = *source++ ;

while (*source) =>tant que on n'a pas '\0' on avance.
*P++ = *source++ ; => le contenu de P va s'écraser tout en avançant!!!

Je vous demander de me clarifier ces instructions et merci d'avance pour vos réponses.

1 réponse

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
24 janv. 2015 à 22:34
void main()
Le bon prototype du main() sans argument est :
int main (void)

Et, cela renvoie 0 :
return 0;


Pour tes questions :
1 comment ça se fait adresse+longueur dans pointeur?
adresse+longueur permet au pointeur de pointer sur le caractère de son choix (décalage). Dans le cas présent, p contiendra l'adresse du '\0' de ch1. Autrement si tu écris sur *p, tu écraseras le '\0'.

Pour le 2ème point, tu as tout juste.

L'erreur provient de l'allocation. ch1 pointe vers "bon" qui est une zone allouée dans une partie en lecture seule. Pas le droit d'écrire dedans. D'ailleurs, si tu avais le droit, ça ne serait pas bon non plus, puisqu'il n'y a pas la place.
Il faut que tu passes par un tableau suffisamment grand. Par exemple :
char ch1[20]="bon";
au lieu de char *ch1="bon";
Ou alors, si tu veux passer par un pointeur :
char *ch1=malloc(20*sizeof(*ch1));
strcpy(ch1,"bon");
1
ygj Messages postés 65 Date d'inscription dimanche 1 février 2009 Statut Membre Dernière intervention 29 décembre 2021 1
26 janv. 2015 à 19:13
merci fiddy,

pour l'entête
void main() 
, je suis d'accord avec toi, ce n'est pas standard, mais c'est juste un cours que j ai trouvé sur le net.

une autre question, d'après ta réponse,
ch1 pointe vers "bon" qui est une zone allouée dans une partie en lecture seule. Pas le droit d'écrire dedans.
est ce que cette remarque est valable seulement pour les déclarations de genre
type *nomPointeur;
???
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
26 janv. 2015 à 19:38
Non c'est valable aussi pour les const char[].
ce qu'il faut voir, c'est que ce n'est pas le pointeur qui empêche la modification mais le "..." (exception pour les tableaux)
0
ygj Messages postés 65 Date d'inscription dimanche 1 février 2009 Statut Membre Dernière intervention 29 décembre 2021 1 > fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022
26 janv. 2015 à 22:07
désolé de dire ça, mais je n'ai pas compris.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
26 janv. 2015 à 22:15
Dans : char *tmp="coucou"; "coucou" alloue un espace mémoire dans la zone en lecture seule.
En revanche, lorsque tu fais char tmp[]="coucou"; le compilateur crée un tableau de 7 cases dans la pile (donc en lecture / écriture) et tmp[0]='c', tmp[1]='o', ...
0
ygj > fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022
30 janv. 2015 à 17:06
merci encore, c est clair maintenant .
0