You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GNU C扩展:void*存标签地址与goto跳转相关技术疑问

GCC扩展goto语句相关问题解答

问题1:const void * const jumptable[]中的第二个const有何作用?该声明是否为“指向const void的const指针数组”?

  • 第二个const修饰的是数组中的指针本身,意思是数组里的每个指针值(通过&&获取的标签地址)是只读的,程序运行时不能修改这些指针指向的位置。
  • 这个声明确实是指向const void的const指针数组:数组的每个元素是const void * const类型——既不能修改指针指向的内容(第一个const,标签指向的代码段本身就是只读的,符合这个限定),也不能修改指针本身的值(第二个const,保证跳转表的标签地址不会被意外篡改)。

问题2:&opp是什么含义?代码使用它的地址做什么?

  • &opp是取变量opp的内存地址,类型为enum Play *(指向enum Play类型的指针)。
  • 代码把这个地址传给select_option函数,是为了让该函数能直接修改opp的值。C语言默认是值传递,要让函数修改外部变量,必须传变量的地址,函数内部通过指针解引用来给opp赋值,以此存储对手的出拳结果。

问题3:select_option()是什么?

  • select_option是一个未给出具体实现的自定义函数,从上下文逻辑可推断它的功能:
    1. 接收一个enum Play *类型的指针参数,通过该参数设置外部变量opp的值(即对手的出拳选择);
    2. 返回0到2之间的整数,对应enum Play里的ROCK、PAPER、SCISSORS枚举值,用来作为跳转表jumptable的索引,决定goto语句跳转到哪个标签执行。

内容的提问来源于stack exchange,提问作者hansoko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 10:35:09