Langage C: pointeurs, pointeurs sur fonctions

Fermé
razuki Messages postés 242 Date d'inscription lundi 17 décembre 2007 Statut Membre Dernière intervention 5 décembre 2012 - 17 juin 2011 à 11:36
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 29 juin 2011 à 20:07
Bonjour,

Lors d'un entretien, j'ai eu un test en langage C et je n'ai pas su répondre aux questions suivantes :

1) Comment est stockée une variable déclarée static dans la mémoire ?
=> je sais juste que static sert à garder une variable en mémoire de manière permanante, cad que même en dehors du bloc de déclaration de la variable, celle-ci n'est pas détruite. Ce qui se passe au niveau plus bas, dans les détails ( mémoire, stack ... etc) je ne sais pas ce qui se passe.

2) Que fait cette instruction :
void (*ptr)(int* (*)(int* tab[]), int**);

=> je sais que ptr est un pointeur sur une fonction qui renvoie un type void, En revanche le premier argument c'est du chinois pour moi ... plus précisément l'étoile que j'ai mis en gras

=> Je sais aussi que y a un call back mais c'est un peu flou pour moi car le nom de la fonction n'apparait pas ( dans le premier argument de la fonction pointée par ptr ).
Dans quel genre de situation on utilise ce genre d'expression ?

3)
void *ptr;
int d  = sizeof(ptr);


d vaut combien ? ( et pourquoi ?)

Merci d'avance pour votre aide.
A voir également:

2 réponses

arthurik Messages postés 166 Date d'inscription dimanche 27 décembre 2009 Statut Membre Dernière intervention 22 juin 2015 14
Modifié par arthurik le 26/06/2011 à 19:13
Salut

1) Une variable static comme tu le dis, n'est pas vraiment variable si tu veux, c'est une adresse dans la mémoire qu'on appelle le TAS, et se promene dans le programme avec seulement l'adresse ou on appelle plutot un pointeur sur une variable.
Si je connait l'adresse de cette variable j'ai pas besoin d'etre dans la fonction où elle a été créée, mais en connaissant l'adresse on peut savoir la valeur de la variable qui se trouve à cette adresse. Donc on alloue une adresse de méoire dans les cases de mémoire.

2) De meme ici comme les variable les foncions aussi elles on des adresses mémoires.
On définit les adresses des fcontions donc pointeur sur une fonction, ainsi on peux lancer n'importe quelle fontion de meme types d'argumetns et de retour biens sur.
C'est pratique pour une programme de dessin ou on choisit des outils, donc on change les adresse de la fontion à lancer et du coup le code ne change pas.

Callback c'est pour lancer cette fonction à une adresse.

3)Ici ce que tu demande c'est connaitre la taille en octets occupé par cette adresse sur la fonction.

sizeof permet de savoir la taillle en octet occupé par chaque type de variable.
Voilà

Pour la partie 2 j'ai pas trop précisé car l'affectation d'une fonction à une adresse se fait en deux etapes. Si tu veux plus, ya un topic sur siteduzero.

http://www.siteduzero.com/tutoriel-3-314203-les-pointeurs-sur-fonctions.html

J'espere de t'avoir aidé.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
Modifié par fiddy le 26/06/2011 à 21:58
1/ Non ce n'est pas dans le tas... C'est dans le segment .bss ou .data
3/ sizeof n'est pas la taille en octet mais en byte.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
26 juin 2011 à 22:02
1/ dans le segment .bss si initialisé à 0 ou .data sinon
2/ il s'agit d'un pointeur sur fonction qui a pour argument un pointeur (sur une fonction avec pour argument un tableau de pointeur sur des entiers) et un double pointeur.
3/ le sizeof renvoie la taille en byte de la variable ou du type passé en paramètre.
Cdlt,
0
arthurik Messages postés 166 Date d'inscription dimanche 27 décembre 2009 Statut Membre Dernière intervention 22 juin 2015 14
Modifié par arthurik le 27/06/2011 à 16:19
si tu sais pas que octet = byte alors inutile de te dire ce que c'est le tas.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
27 juin 2011 à 18:25
Sauf qu'un byte est un groupe de bits (souvent 8 mais pas forcement). La traduction la plus juste est multiplet. D'ailleurs, la norme ISO précise bien qu'un char occupe un byte d'au moins 8 bits. Sur google, tu trouveras de la doc à ce sujet.
Pour les variables statiques, ce n'est certainement pas dans le tas qui est réservé à l'allocation dynamique. Ces variables sont stockées dans les segments data ou bss selon leur initialisation.
0
arthurik Messages postés 166 Date d'inscription dimanche 27 décembre 2009 Statut Membre Dernière intervention 22 juin 2015 14
Modifié par arthurik le 27/06/2011 à 23:03
BYTE bit octet l'important c'etais pas ça, mais j'avoue que je savais pas l'histoire de variabilité de bites,ça dépend du compilateur. Par rapport à DOC j'ai pas vraiment besoin de tout ça. Car la pratique definie mes propres documentation si tu vois ce que je veux dire. Il faut avoir son propre style de dire les choses pour avoir un avantage. Attention c mon avis et à ne pas discuter :D!
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
27 juin 2011 à 23:34
Il faut avoir son propre style de dire les choses pour avoir un avantage.
Certes, mais expliquer avec ses mots n'empêche pas de donner une réponse juste.
Car en répondant que sizeof renvoie la taille en octet c'est faux. Même si c'est ta façon de dire.
De même que dire l'allocation de variables statiques se passe dans le tas est faux.

Mais, l'important c'est que tu te comprennes et que tu saches ce que tu fais ^^.
0
arthurik Messages postés 166 Date d'inscription dimanche 27 décembre 2009 Statut Membre Dernière intervention 22 juin 2015 14
27 juin 2011 à 23:38
Je parie qu'il a rien pigé de ce que t'a dit alors ta réponse elle peut etre juste tant qu'elle veux.Tout ce que je dis c'est quil faut expliquer pas dire:
"dans le segment .bss si initialisé à 0 ou .data sinon "
Je pense qu'on va pas continuer..
0