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是一个未给出具体实现的自定义函数,从上下文逻辑可推断它的功能:- 接收一个
enum Play *类型的指针参数,通过该参数设置外部变量opp的值(即对手的出拳选择); - 返回0到2之间的整数,对应
enum Play里的ROCK、PAPER、SCISSORS枚举值,用来作为跳转表jumptable的索引,决定goto语句跳转到哪个标签执行。
- 接收一个
内容的提问来源于stack exchange,提问作者hansoko
相关产品推荐
相关产品推荐

