102 votes

Que signifie && moyenne en void * p = & &abc;

Je suis tombé sur un morceau de code . Quelle est la signification de ici ? Je sais les références de rvalue mais je pense que utilisé dans ce contexte est différent. Que signifie indiquer dans `` ?

154voto

Prasoon Saurav Points 47488

`` est l’extension du CCG pour obtenir l’adresse de l’étiquette définie dans la fonction en cours.

``est illégal dans le standard C99 et C++.

Cette compile avec g ++.

96voto

Flavius Points 6115

Comment la trouver

C'est l'adresse d'un label et c'est une caractéristique spécifique à GCC.

int main(void) {
    void* startp;
s:
    startp = &&s;
    printf("the assignment above starts at address %p\n", startp);
    return 0;
}

Vous pourriez avoir pensé à elle-même par les tests:

int main(void) {
    void* startp;
    int a;
    startp = &&a;
    printf("startp=%p\n", startp);
    return 0;
}

Auquel cas GCC dit:

erreur: l'étiquette " a " utilisé mais non défini

Sous le capot - assemblée

Vous avez besoin de savoir l'assembleur pour bien comprendre cela, mais je vais essayer de vous expliquer ce qu'est une adresse d'un label.

Après le système d'exploitation charges de l' .exe fichier à partir du disque, un composant du système d'exploitation appelé le "loader" (windows a la "PE Loader", linux a "chargeur ELF" ou peut-être même à d'autres, si ils sont compilés dans le noyau), il le fait d'une "virtualisation" de ce programme, le transformant en un processus.

Ce processus pense qu'il est le seul dans la RAM et il a accès à la totalité de la RAM (qui est, 0x00000000-0xFFFFFFFF sur une machine 32 bits).

(ce qui précède est juste un court overwiew de ce qui est passe, vous avez vraiment besoin d'apprendre de l'assemblée pour bien le comprendre, si patient avec moi)

Maintenant, l'étiquette dans un code source est fondamentalement une adresse. "goto label;" ne fait rien d'autre qu'un saut à cette adresse (pensez au pointeur d'instruction dans l'assemblage). Ce label magasins de RAM de répondre, et c'est la façon dont vous pouvez trouver cette adresse.

Après que vous avez appris ASM, vous vous rendrez compte que cette adresse pointe vers un enseignement au sein de l' .text de la section de l'exécutable. L' .text section est celle qui vous tient le programme (binaire) de l'exécution d'un code.

Vous pouvez inspecter ce avec:

objdump -x un.hors

Un exemple pratique

Comme décrit dans GCC, vous pouvez l'utiliser pour initialiser un saut de la table. Certains scanner générateurs comme re2c (voir l' -g paramètre) l'utiliser pour générer plus de scanner compact. Peut-être il y a même un analyseur générateur en employant la même technique.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X