Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1403 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Suivante
Auteur Sujet :

copie d'une chaine de caractères

n°1240701
Emmanuel D​elahaye
C is a sharp tool
Posté le 07-11-2005 à 19:06:12  profilanswer
 

Reprise du message précédent :

in_your_phion a écrit :


Code :
  1. #include <stdio.h>
  2. int main () {
  3. int a =10;
  4. printf ("%p\n",&a);
  5. return 0;
  6.  
  7. }


j'ai pas d'erreur, et pourtant a est une constante, nan  :??:


Non (manque un void*). a n'est certainement pas une constante, la preuve, c'est que tu a résussi à prendre son adresse, preuve que c'est une objet.  
Ce code fonctionne aussi :


#include <stdio.h>
 
int main ()  
{
   int a;
   printf ("%p\n", (void*) &a);
 
   return 0;
}


C'est un objet de type int initialisé avec une valeur. C'est la valeur en elle même qui est une constante. Mais une fois qu'elle a été copiée dans la variable, celle-ci (la variable) ne devient pas magiquement une constante, même si on ajoute le mot clé 'const', qui, rappelons-le une ènième fois, transforme un objet modifiable en un objet non modifiable.  
 
Mais ça reste un objet. Certainement pas une constante. Je rappelle qu'une constante n'a pas d'adresse et n'est donc pas un objet.
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
mood
Publicité
Posté le 07-11-2005 à 19:06:12  profilanswer
 

n°1241272
blackgodde​ss
vive le troll !
Posté le 08-11-2005 à 14:36:29  profilanswer
 

désolé pour la confusion.
 
P.O. = ?


---------------
-( BlackGoddess )-
n°1241280
Elmoricq
Modérateur
Posté le 08-11-2005 à 14:40:08  profilanswer
 

"Posteur Originel", je pense.

n°1241304
Emmanuel D​elahaye
C is a sharp tool
Posté le 08-11-2005 à 14:55:19  profilanswer
 

Elmoricq a écrit :

"Posteur Originel", je pense.

vi.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1241521
in_your_ph​ion
Posté le 08-11-2005 à 18:10:17  profilanswer
 

Emmanuel Delahaye a écrit :

Non (manque un void*). a n'est certainement pas une constante, la preuve, c'est que tu a résussi à prendre son adresse, preuve que c'est une objet.  
Ce code fonctionne aussi :


#include <stdio.h>
 
int main ()  
{
   int a;
   printf ("%p\n", (void*) &a);
 
   return 0;
}


C'est un objet de type int initialisé avec une valeur. C'est la valeur en elle même qui est une constante. Mais une fois qu'elle a été copiée dans la variable, celle-ci (la variable) ne devient pas magiquement une constante, même si on ajoute le mot clé 'const', qui, rappelons-le une ènième fois, transforme un objet modifiable en un objet non modifiable.  
 
Mais ça reste un objet. Certainement pas une constante. Je rappelle qu'une constante n'a pas d'adresse et n'est donc pas un objet.


 
 
d'accord, merci encore .. abu de langage de ma part :/ .... j'ai une dernière question relative aux chaines de caractères, peut être que je pourrait comprendre avec ca ... :heink:  
 
pourquoi peut on modifier  
 

Code :
  1. char toto[] = "zoubida";


 
et pas  
 

Code :
  1. char *toto = "zoubida";


 
 
..le cas 1 marche et pas le cas 2 (segmentation fault) ? mouhaha ..snif  :cry:

Message cité 1 fois
Message édité par in_your_phion le 08-11-2005 à 18:11:51
n°1241536
Emmanuel D​elahaye
C is a sharp tool
Posté le 08-11-2005 à 18:40:30  profilanswer
 

in_your_phion a écrit :

pourquoi peut on modifier  

Code :
  1. char toto[] = "zoubida";


et pas  

Code :
  1. char *toto = "zoubida";




Dans le premier cas, on a un tableau de char initialisé. Il est modifiable.
Dans le premier cas, on a un pointeur sur une chaine littérale. Elle n'est modifiable[1].
 
--------------
[1] Tout simplement parce que comme du code, elle pourrait être mappée en ROM. C'est exactement le cas en embarqué.  
 
C'est aussi pour des problèmes d'optimisation du code.

char *pa = "bonjour";
char *pb = "jour";


Bien que ce ne soit pas garanti, on pourrait tout à fait avoir

pb == pa + 3


Si on modifiait une chaine, ça modifierait l'autre en douce... Ingérable...

Message cité 1 fois
Message édité par Emmanuel Delahaye le 15-11-2005 à 08:43:33

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1241880
matafan
Posté le 08-11-2005 à 23:10:12  profilanswer
 

En passant, si toto est une globale, le premier cas n'est pas plus modifable que le deuxieme. L'explication d'Emmanuel n'est valable que si toto est defini dans un bloc. D'ailleurs dans ce cas tu verra que le premier exemple genere des instructions qui vont placer les characteres 'z', 'o', 'u', ... un par un dans le tableau toto... Donc a la base dans le cas du tableau, et si on est dans un bloc, l'initialisation est une modification.

n°1241950
Emmanuel D​elahaye
C is a sharp tool
Posté le 09-11-2005 à 09:10:58  profilanswer
 

matafan a écrit :

En passant, si toto est une globale, le premier cas n'est pas plus modifable que le deuxieme.


Gné ? Le comportement est strictement identique. La seule différence est que la variable est initialisée avant exécution du main().


Message édité par Emmanuel Delahaye le 09-11-2005 à 10:08:26

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1241972
blackgodde​ss
vive le troll !
Posté le 09-11-2005 à 09:55:35  profilanswer
 

matafan a écrit :

D'ailleurs dans ce cas tu verra que le premier exemple genere des instructions qui vont placer les characteres 'z', 'o', 'u', ... un par un dans le tableau toto...


 
je viens de désassembler un exe compilé avec vc++7.1 en release, et ce n'est pas le cas.
 
edit : d'ailleurs si quelqu'un connait une solution avec vc++7.1 pour lui faire ecrire octets par octets une chaine sur la pile, je suis preneur car pour l'instant la seule solution que j'ai trouvée est :
 

Code :
  1. void func()
  2. {
  3.   char tab[5];
  4.   tab[0]='t';
  5.   tab[1]='e';
  6.   tab[2]='s';
  7.   tab[3]='t';
  8.   tab[4]=0;
  9. }



Message édité par blackgoddess le 09-11-2005 à 10:13:49

---------------
-( BlackGoddess )-
n°1245731
in_your_ph​ion
Posté le 15-11-2005 à 00:33:37  profilanswer
 

Emmanuel Delahaye a écrit :

Dans le premier cas, on a un tableau de char initialisé. Il est modifiable.
Dans le premier cas, on a un pointeur sur une chaine littérale. Elle n'est modifiable[1].
 
--------------
[1] Tout simplement parce que comme du code, elle pourrait être mappée en ROM. C'est exactement le cas en embarqué.  
 
C'est aussi pour des problèmes d'optimisation du code.

char *pa = "bonjour";
char *pb = "jour";


Bien que ce ne soit pas garanti, ou pourrait tout à fait avoir

pb == pa + 3


Si on modifiait une chaine, ça modifierait l'autre en douce... Ingérable...


 
 
d'accord ... merci !! ..j'aurais juste une dernière question si possib' :sweat: , est-ce que je peux au moins faire :
 

Code :
  1. char * p= "bonjour";
  2. p = "au revoir";


 
 
je peux ça ???

mood
Publicité
Posté le 15-11-2005 à 00:33:37  profilanswer
 

n°1245767
Emmanuel D​elahaye
C is a sharp tool
Posté le 15-11-2005 à 08:42:34  profilanswer
 

in_your_phion a écrit :

est-ce que je peux au moins faire :

Code :
  1. char * p= "bonjour";
  2. p = "au revoir";


je peux ça ???


Oui. Mais il vaut mieux le coder ainsi :  


   char const * p = "bonjour";
 
   p = "au revoir";


Message édité par Emmanuel Delahaye le 15-11-2005 à 08:44:11

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
Exécuter une chaîne de caractère en PL/SQLCouper chaîne de caractère
init d'un dict à partir d'une chaîne de caractère [résolu]fonction pour recuperer un chiffre d'une chaine [Résolu]
probleme minute: fonction chaine en php(Résolu) - Caractères acceptés dans un champ par MySQL
remplacer une chaine de caractere dans un fichier en .bat[résolu] pb longueur de chaîne avec dbi:PgPP
wtring et caracteres unicode hexatous les caracteres utf8
Plus de sujets relatifs à : copie d'une chaine de caractères


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR