Initiation d'un pointeur

ygj Messages postés 65 Date d'inscription   Statut Membre Dernière intervention   -  
 ygj -
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   Statut Contributeur Dernière intervention   1 846
 
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   Statut Membre Dernière intervention   1
 
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   Statut Contributeur Dernière intervention   1 846
 
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   Statut Membre Dernière intervention   1 > fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention  
 
désolé de dire ça, mais je n'ai pas compris.
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
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   Statut Contributeur Dernière intervention  
 
merci encore, c est clair maintenant .
0