嘿,下面的代码让我发疯,并且在我运行它时给我一个段错误。请注意,我在这里使用的是一流标签。
#include <stdio.h>
main()
{
static void* array[] = {&&label2, &&label1};
void* programCount = array;
goto *programCount++;
label2: ;
int b = 100;
printf("%d\n", b);
label1: ;
int b2 = 1000;
printf("%d\n", b2);
}
我不明白为什么会这样,它编译得很好...
最佳答案
这个问题涉及一个 gcc 扩展,Labels as Values .
尽管在使用 -Wall -pedantic
编译时会给出很多警告,但问题中的代码编译良好。我想问题出在对 void*
指针的赋值上。以下代码运行良好:
static void* array[] = {&&label2,&&label1};
goto *array[0];
正如@ouah 所写,您的 void 指针的类型是错误的。当您使用 void**
时,以下内容也有效:
void** programCount = array;
goto *programCount[0];
// or goto *programCount[1];
最后,为了反射(reflect)您问题中的代码,您还可以使用
void** programCount = array;
goto **(++programCount);
跳转到数组中的第二个标签(label1
)。请注意,在评估其值之前,您需要使用预递增来递增指针。
免责声明:我不赞成在 C 或 C++ 中使用标签或 goto
。还有其他语言元素可以为此类问题提供更合适的解决方案,例如正如@jweyrich 编写的指向函数的指针数组。由于这是不可移植的,它不应该在现实生活中使用(如果我是代码审查者,它不会通过审查;-))
关于c - 跳转到标签时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14307355/