&&是什么意思在void * p = && abc;?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (74)

我遇到了一段代码void *p = &&abc;&&这里有什么意义?我知道右值引用,但我认为&&在这种情况下使用是不同的。什么&&表明void *p = &&abc;

提问于
用户回答回答于
用户回答回答于

如何找到它

这是标签的地址,它是GCC特有的功能。

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

你可以通过测试自己弄明白:

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

GCC在这种情况下说:

错误:使用但未定义的标签'a'

你需要了解汇编程序才能真正理解这一点,但我会尽力向你解释标签的地址是什么意思。

操作系统从磁盘加载.exe文件后,操作系统的一个称为“加载器”的组件(windows有“PE加载器”,linux有“ELF加载器”或者甚至其他的,如果它们在内核),它会对该程序进行“虚拟化”,将其转化为一个过程。

这个过程认为它是RAM中唯一的一个,它可以访问整个RAM(即32位机器上的0x00000000-0xFFFFFFFF)。

(以上只是对发生的事情的简短回顾,你真的需要学习大会来充分理解它,所以请耐心等待)

现在,源代码中的标签基本上是一个地址。“goto标签;” 除了跳转到该地址之外没有其他任何事情。这个标签存储这个RAM地址,这就是你如何找到这个地址。

学习ASM之后,你会意识到该地址指向.text可执行文件部分中的指令。该.text部分是持有程序的(二进制)代码执行的部分。

你可以检查这个:

objdump -x a.out

一个实际的例子

GCC中所述,你可以使用它来初始化跳转表。一些像re2c这样的扫描仪生成器(请参阅参数)使用它来生成更紧凑的扫描仪。也许甚至有一个解析器生成器采用相同的技术。-g

扫码关注云+社区