int peek=0;
int a=0;
int i=0;
int n=0;
int offset=0;
int main(int argc, char *argv[])
{
long* memoireAllouee = NULL;
memoireAllouee = malloc(sizeof(char)*1000); // Allocation de la mémoire
long *adresse=NULL; // Initialisation et mise a zero du pointeur adresse
adresse=memoireAllouee; // Récupération de l'adresse de la plage mémoire allouée
printf("plage mémoire allouee %lx val adresse %lx \n",memoireAllouee,adresse);
system("PAUSE");
for (n = 0 ; n<255 ; n++) // Boucle verticale du dump
{
DeAtHCrAsH
Messages postés2670Date d'inscriptionvendredi 25 janvier 2002StatutMembreDernière intervention 6 février 2013 23 nov. 2007 à 21:28
En fait si tu veux, l'adresse du pointeur est codé sur 4 octets (système 32 bits), donc un long ou un int.
Après selon le type de pointeur déclarée, l'incrémentaton va se faire au cas par cas.
En gros si tu veux incrémenter de 1 octet, faut que tu utilises un type dont le sizeof(..) vaut 1 octet, ce qui est le cas des char et byte.
- sizeof(byte) sizeof(char) 1 octet => Donc l'incrémentation du pointeur se fera octet par octet- sizeof(int) sizeof(long) 4 octets => Donc l'incrémentation du pointeur se fera par passe de 4 octets
int peek=0;
int a=0;
int i=0;
int n=0;
int offset=0;
int main(int argc, char *argv[])
{
long* memoireAllouee = NULL;
memoireAllouee = malloc(sizeof(char)*1000); // Allocation de la mémoire
long *adresse=NULL; // Initialisation et mise a zero du pointeur adresse
adresse=memoireAllouee; // Récupération de l'adresse de la plage mémoire allouée
printf("plage mémoire allouee %lx val adresse %lx \n",memoireAllouee,adresse);
system("PAUSE");
for (n = 0 ; n<255 ; n++) // Boucle verticale du dump
{
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 22 nov. 2007 à 12:21
Salut,
J'ai comme l'impression que tu veux afficher des octets, alors que tu utilise un pointeur sur des long.
long *adresse=NULL;
Avec ça, si tu fais adresse++, adresse est en fait incrémenté de siezeof(long)
Si tu veux des octets, déclare des char * et des char.
<hr size="2" width="100%" />3ème année en ecole d'ingé d'info cherche stage de 4 mois à partir du 01/04/08
Vous n’avez pas trouvé la réponse que vous recherchez ?
DeAtHCrAsH
Messages postés2670Date d'inscriptionvendredi 25 janvier 2002StatutMembreDernière intervention 6 février 2013 22 nov. 2007 à 16:37
Un pointeur est toujours codé sur 4 octets, soit la taille d'un int (ou d'un long sur système 32 bits).sizeof(char *) sizeof(int *) sizeof(long *) = ....
cs_N3oPhyte
Messages postés6Date d'inscriptionjeudi 22 novembre 2007StatutMembreDernière intervention24 novembre 2007 22 nov. 2007 à 17:08
Ok je comprends que le pointeurs soit codé sur 4 octets pour accéder à la mémoire complète mais ça n'explique pas que l'ont ne puisse pas l'incrémenter de 1? ou je dit une grosse bétise?
de même la syntaxe printf("%c",*(adresse+i)); est valable pour avoir le contenu du de l'adresse du pointeur (*adresse+i))?? ou je fait fausse route
Merci de votre aide, c'est sympa d'avoir un contact avec des gens qui maitrise,
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 22 nov. 2007 à 19:55
On peut l'incrémenter de 1, mais il faut caster.
L'incrémentation de la taille du type pointé est une fonctionnalité du langage C sensée faciliter le travail avec les pointeurs... Quand on incrémente des pointeurs, c'est généralement pour parcourir des tableaux. Donc passer de case en case en incrémentant de 1 leur a semblé plus simple que d'incrémenter de sizeof le type du tableau.
C'est un peu pareil quand tu fais tab[i], tu fais pas tab[sizeof(MonTypeDeCase) * i]. Pourtant, en interne, c'est globalement ce qui se ferat.
DeAtHCrAsH
Messages postés2670Date d'inscriptionvendredi 25 janvier 2002StatutMembreDernière intervention 6 février 2013 23 nov. 2007 à 14:28
Si ca peut t'aider voici une petite explication plus claire.
Exemple 1:
Un entier est codé sur 4 octets.
Si je déclare un tableau de 2 entiers, j'occuperai donc un espace mémoire de 8 octets.
Mes deux éléments de mon tableau sont tous deux accessible par un pointeur chacun.
Si je prend le pointeur du premier élément et que je l'incrémente de 1, alors je passe à mon deuxième élément, soit 4 octets plus loin.
=> L'incrémentation de pointeur d'entier se fait donc par passe de 4 octets.
Exemple 2:
Un char est codé sur 1 octet.
Si je déclare un tableau de 2 char, j'occuperai donc un espace mémoire de 2 octets.
Mes deux éléments de mon tableau sont tous deux accessible par un pointeur chacun.
Si je prend le pointeur du premier élément et que je l'incrémente de 1, alors je passe à mon deuxième élément, soit 1 octet plus loin.
=> L'incrémentation de pointeur de char se fait donc par passe de 1 octet.
Conclusion générale :
Quand tu incrémentes un pointeur, celui ci s'incrémentera de la taille du type de l'élément auquel il fait référence.
cs_N3oPhyte
Messages postés6Date d'inscriptionjeudi 22 novembre 2007StatutMembreDernière intervention24 novembre 2007 23 nov. 2007 à 16:01
je commence à percuter merci deathcrash pour ta précision, je pense que donc pour le mémory dump, je peut déclarer le pointeur sur la mémoire en char et l'incrémenter de 1 ? (je ne pensais pas q'un pointeur pouvais être autre chose que long!!) ;)
int peek=0;
int a=0;
int i=0;
int n=0;
int offset=0;
int main(int argc, char *argv[])
{
long *memoireAllouee = NULL;
memoireAllouee = malloc(sizeof(char)*10000); // Allocation de la mémoire
char *adresse=NULL; // Initialisation et mise a zero du pointeur adresse
adresse=memoireAllouee; // Récupération de l'adresse de la plage mémoire allouée
printf("plage mémoire allouee %lx val adresse %lx \n",memoireAllouee,adresse);
system("PAUSE");
for (n = 0 ; n<255 ; n++) // Boucle verticale du dump
{
printf("n %ld adresse %lu memoireAllouee %ld \n",n,adresse,memoireAllouee);
printf ("debut de la boucle n");
for (i = 0 ; i < 60; i++) // Boucle horizontale du dump
{
// peek=*(adresse+i);
printf("%c",*adresse); // Affiche le contenue de l'adresse mémoire
adresse=adresse+1; // Incrémentation de 1 du pointeur adresse
}
printf("\n"); // Retour à la ligne en fin d'affichage