Ghosts In The Stack

Commentaires - Pointeurs et tableaux

Poster un commentaire - Retour à l'article

Commentaires

Ghawk, le 29/06/2010 :

Salut, 'sizeof' n'est pas une fonction mais un opérateur d'arité un-aire (il prend un opérande), faut pas confondre. :-p
C'est en plus un mot clé réservé.

Aussi, il retourne la taille de son opérande (objet ou type de données) en multiplets et non en octets.

Octet = 8 bits
Multiplet = 8 bits ou plus (la norme ANSI du langage C dit qu'un multiplet fasse au minimum 8 bits !)

Le nombre de bits d'un multiplet est représenté par la constante symbolique 'CHAR_BIT' définie dans le fichier d'interface 'limits.h'...

Les pointeurs ne sont pas obligatoirement implémenté dans une mémoire de 32 bits (4 octets). Tout dépend de l'architecture.

Voilà les grosses erreurs que j'ai remarqué. :)

Sinon, ma foi, c'est une bonne introduction aux pointeurs. :-]

Bonne continuation !

Réponse :

Effectivement... J'ai écrit cet article il y a bien longtemps :)
Merci de tes remarques !

blackstones, le 11/03/2010 :

J'ai quelques questions, pertinente je sais pas mais j'aimerai savoir:

1) pourquoi ce code

int main()
{
int a = 2;
printf("adresse de a : %x\n",&a); //le %x permet d'afficher en héxadécimal

int b = 3;
int * p_b;
*p_b = b; //p_b pointe alors vers b, donc 3
printf("p_b = : %x\n",p_b);
printf("*p_b = %d", (int) *p_b);
getchar();
}

ne fonctionne pas si on enléve :

. . .
int a = 2;
printf("adresse de a : %x\n",&a); //le %x permet d'afficher en héxadécimal
. . .

J'obtiens Segmentation fault

et j'ai pu remarquer que l'adresse de "a"(22ff74) et dans le même espace mémoire que "b" (22ffa8) dans votre exemple.

2) et pourquoi ?

int b = 3;
int * p_b;
*p_b = b; // et non p_b = &b;

car si j'ai bien compris, dans le code ci-dessus, on affecte la valeur de "b" à l'adresse ou pointe "p_b" (*p_b = b;)

mais ce dernier n'ayant pas d'adresse (on déclare le pointer "p_b" sans l'avoir initialiser), mais on ne lui a donné aucune adresse vers laquelle pointer (du style int * p_b = &b;)

Voilà j'espère avoir été claire dans mes question. Et merci pour vos article, qui sont clair et précis.

PS : Est-ce que vous prévoyez de faire un article sur le langage Assembleur peut être pas traiter le langage complètement, mais juste les bases, car j'ai suivi vos articles sur les ShellCodes, mais je suis un peu perdu avec les "eax,ebx,popl ect...)

Réponse :

Wow... il y a longtemps que j'ai écrit cet article visiblement. Il y a une grosse erreur :

int b = 3;
int * p_b;
*p_b = b; //p_b pointe alors vers b, donc 3

Je n'ai pas initialisé p_b, donc il ne pointe vers rien du tout et c'est normal que ça crashe dans certains cas ! Ca fonctionne quand a est déclaré surement parce que la pile contient à ce moment des pointeurs valides, mais c'est vraiment pas top.

Donc pour pouvoi modifier b par l'intermédiaire de p_b, il faudrait effectivement faire p_b = &b.

En tout cas merci beaucoup d'avoir signalé cette grosse erreur. Mea culpa...

0mar, le 21/02/2008 :

tré boooooooooon article !!
BRAVO !!!!

saelyx, le 06/02/2007 :

int *p_a;

// [...]

printf("Adresse de a : %x ; Contenu de a : %d ; Contenu de p_a : %x",&a,a,p_a);

// [...]

printf("Contenu de p_a : %x",p_a);

// le contenu d'un pointeur s'affiche de la manière suivante :

printf("Contenu de p_a : %x",*p_a);

ça doit être une erreur

Réponse :

En fait... non :) Quand je met "contenu de p_a", je sous-entend en fait "la valeur qui se trouve dans la case mémoire appelée p_a". Donc c'est la valeur du pointeur (l'adresse) et non celle de la variable pointée que je voulais désigner.

Sinon, en effet, pour afficher la valeur de la variable a pointée par p_a, il aurait bien fallu mettre ce que tu as mis.

Merci de la remarque... En effet ce n'est peut-être pas très clair comme ça. j'essaierai de penser à changer ça lors de la migration vers la v2 :)

Poster un commentaire

Les commentaires sont soummis à certaines règles, qui sont une question de bon sens.

Utilisez-les à bon escient. Vous pouvez donnez votre opinion, vos critiques, nous signaler des fautes, apporter des précisions. Vous pouvez également nous poser des questions ; nous essaierons de vous répondre dans la mesure du possible.

Ne confondez pas commentaires et forum ; votre commentaire doit être en rapport avec l'article. Si vous souhaitez donner un commentaire général sur le site, envoyez-nous plutôt un mail.

Merci de nous laisser votre adresse e-mail, afin que nous puissions vous recontacter si besoin. Le code HTML n'est pas interprété dans les commentaires.

Les commentaires sont soummis à une validation des administrateurs. S'ils ne respectent pas ces règles, ils seront systématiquement refusés. Merci de votre compréhension ;-)