Léa-Linux & amis :   LinuxFR   GCU-Squad   GNU
lecure de la memoire en C
Envoyé par: oliv

Salut a tous

Avec le sript suivant je cherche a visualiser le contenu d'un espace memoire:
main ()
{
/* Zone de declaration des variable programme */

int var1; /*declaration de var1*/
char *pt; /*declaration de la variable qui servira de pointeur*/
int i; /*declaration de la variable d'increment*/

/* zone corp de programme */

pt=(char*)&var1;

printf("\n");
printf("-------------lancement programme-------------------\n");
printf("\n");
printf("entrez valeur pour var1: "); /*demande de saisie de la valeur de var1*/
scanf("%i",&var1); /*saisie de la valeur de var1*/
printf("\n");
printf("adresse memoire de var1 =%p et valeur de var1 =%i\n", &var1,var1 );

for (i=0; i<sizeof(var1); i++) /*debut boucle de lecture des octets memoire*/
{
printf("octet memoire %d=%p a la valeur %x\n", i , pt + i , *(pt+i) );
}
printf("\n");
printf("-------------fin de programme-----------------------\n");
printf("\n");
}

Si ma valeur de "var1" est 444, je devrais avoir le premier octe memoire avec la valeur bc et le second octe memoire avec la valeur 1. Mais en realite mon premier octe memoire m'indique le valeur ffffffbc, et la je ne comprend pas.
Quelle est l'explication a cela?

Merci

A+

Poste le Saturday 4 June 2005 09:08:40
Répondre     Citer    
Re: lecure de la memoire en C
Envoyé par: Sve@r

En C, il faut faire très attention
1) au type d'une variable (signed/unsigned)
2) à la façon dont tu affiches une variable (%d %u)

Tu remarques que dans "ffffffbc" il y a bien "bc". Mais ce "bc" (1011 1100) a le premier bit (bit de signe) à "1". En plus, "*pt" est un "char" donc un "signed char".
Donc, quand le compilo voit que tu affiches un "signed char" au format "%x" (format d'un entier affiché en hexa), il transforme automatiquement "(signed char)bc" en "(signed int)bc".
Or, quand un nombre négatif est transformé en nombre d'un type plus large, le bit de signe s'il est à "1" est automatiquement recopié pour conserver cette négativité.
Exemple: "-16" en char vaut "1111 0000". Mais si tu recopies ce "-16" dans un "int" et que tu veux conserver sa valeur, il faut alors étendre le bit de signe et cela donne "1111 1111 1111 0000" (toujours égal à -16)

Donc ici, comme le compilo croit que tu travailles avec un nb négatif qu'il est forcé de conserver, il passe automatiquement de "1011 1100" à "1111 1111 1011 1100"

Si tu veux en avoir la preuve, tape "364" au lieu de "444". "364" s'écrit "16C" en hexa et "6C" s'écrit "0110 1100" => là, le bit de signe vaut "0" donc il ne sera pas étendu et "0110 1100" restera "0000 0000 0110 1100" quand il sera transformé en "int"

Pour en revenir à ton pb, déclare "pt" comme "unsigned char*" et cela devrait aller... ou alors fait
printf("%x", (unsigned char)*(pt + i));

PS: Je ne connaît pas l'option "%i" de printf...

Poste le Saturday 4 June 2005 16:06:00
Répondre     Citer    
Re: lecure de la memoire en C
Envoyé par: oliv

Merci pour l'info.

Mais j'ais toujours une incoppreantion sur le resultat obtenu.
En effet pour un octet de memoire j'aurais, elon mon script, une info de type ffffffbc et cette info est sur 4 octet. Donc la il y a quelque chose qui m'echape.

P.S.: Je ne me souviens plus de la signification de %i, mais je la recherhcer.

Il n'y a de dieu que DIEU, et Mouhammed est le messager de DIEU.

Poste le Tuesday 7 June 2005 10:07:58
Répondre     Citer    
Re: lecure de la memoire en C
Envoyé par: otouche

hello juste un petit resume.
%i signifie de type int. or un int occupe 4 octets.
donc si tu declares un pointeur sur un int ce dernier occupera au minimum la taille d'un int soit 4 octets.
voila.;-)

Poste le Tuesday 7 June 2005 13:35:06
Répondre     Citer    
Re: lecure de la memoire en C
Envoyé par: otouche

oooops excuse moi .
%i signifie de type int. or un int occupe 4 octets. je voulais dire %d et non %i desole ;-)

Poste le Tuesday 7 June 2005 13:45:34
Répondre     Citer    
Re: lecure de la memoire en C
Envoyé par: otouche

au fait %d et %i designe tout deux un int signe donc identique. voila bonne suite;-)

Poste le Tuesday 7 June 2005 13:58:59
Répondre     Citer    
Re: lecure de la memoire en C
Envoyé par: Sve@r

Citation
oliv
Merci pour l'info.

Mais j'ais toujours une incoppreantion sur le
resultat obtenu.
En effet pour un octet de memoire j'aurais, elon
mon script, une info de type ffffffbc et cette
info est sur 4 octet. Donc la il y a quelque chose
qui m'echape.

P.S.: Je ne me souviens plus de la signification
de %i, mais je la recherhcer.

Il n'y a de dieu que DIEU, et Mouhammed est le
message de DIEU.

Ben oui! tu demandes à "printf" d'afficher une valeur au format "int". Donc "printf" cherche une valeur tenant sur 4 octets. Si la valeur qu'il a en correspondance en fait moins, ben il complète automatiquement selon les règles de l'extension du bit de signe si 1) tu demandes un affichage signé et si 2) le bit de signe de la valeur vaut 1 => "bc" devient "ffff ffbc"

Poste le Tuesday 7 June 2005 18:03:25
Répondre     Citer    

Veuillez vous authentifier auparavant pour commenter.

 

Ce forum !
lecure de la memoire en C
Pour poser vos questions sur les scripts shell, le Perl, le C, etc... Attention : nous ne sommes pas des spécialistes du dev, ce forum est juste pour de petites aides ponctuelles concernant le développement et les outils de développement.

Sauf mention contraire, les documentations publiées sont sous licence Creative-Commons