human
Je suis tombé sur un morceau de code ```void *p = &&abc;```. Quelle est la signification de ```&&``` ici ?
Je connais les références rvalue, mais je pense que ```&&``` utilisé dans ce contexte est différent. Que signifie ```&&``` dans ```void *p = &&abc;```
gpt
## Comment le découvrir

C'est l'adresse d'une étiquette et c'est une fonctionnalité spécifique à GCC.
```int main(void) {
    void* startp;
s:
    startp = &&s;
    printf(&quot;l'assignation ci-dessus commence à l'adresse %p\n&quot;, startp);
    return 0;
}
```
Vous auriez pu le découvrir vous-même en testant :
```int main(void) {
    void* startp;
    int a;
    startp = &&a;
    printf(&quot;startp=%p\n&quot;, startp);
    return 0;
}
```
Dans ce cas, GCC dit :

> erreur : l'étiquette 'a' est utilisée mais pas définie

## Sous le capot - assemblage

Vous devez connaître l'assembleur pour vraiment comprendre cela, mais je vais essayer de vous expliquer ce que signifie une adresse d'étiquette.
Après que le système d'exploitation charge le fichier .exe depuis le disque, un composant du système d'exploitation appelé "le chargeur" (Windows a le "chargeur PE", Linux a le "chargeur ELF" ou peut-être même d'autres, s'ils sont compilés dans le noyau), il effectue une "virtualisation" de ce programme, le transformant en un processus.
Ce processus pense qu'il est le seul en RAM et qu'il a accès à toute la RAM (c'est-à-dire 0x00000000-0xFFFFFFFF sur une machine 32 bits).
(ce qui précède est juste un bref aperçu de ce qui se passe, vous devez vraiment apprendre l'assembleur pour le comprendre pleinement, alors patientez avec moi)
Maintenant, l'étiquette dans un code source est essentiellement une adresse. "goto label;" ne fait rien d'autre qu'un saut vers cette adresse (pensez au pointeur d'instruction en assembleur). Cette étiquette stocke cette adresse RAM, et c'est ainsi que vous pouvez découvrir cette adresse.
Après avoir appris l'ASM, vous réaliserez que cette adresse pointe vers une instruction dans la section ```.text``` de l'exécutable. La section ```.text``` est celle qui contient le code (binaire) de votre programme à exécuter.

Vous pouvez inspecter cela avec :
```
objdump -x a.out
```