嘿,下面的代码让我发疯,并在运行时给我一个分段错误。注意我在这里使用头等标签。
#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);
}
我不明白为什么会发生这种情况,它编写得很好......
答案 0 :(得分:3)
此问题涉及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];
最后,为了反映您问题中的代码,您还可以使用
void** programCount = array;
goto **(++programCount);
跳转到数组中的第二个标签(label1
)。请注意,在评估其值之前,需要使用预递增来递增指针。
免责声明:我不赞成在C或C ++中使用标签或goto
。还有其他语言元素为这些问题提供了更合适的解决方案,例如,因为@jweyrich编写了指向函数的指针数组。由于这是不可移植的,因此不应在现实生活中使用(如果我是代码审查员,则不会通过审核;-))
答案 1 :(得分:1)
programCount
的类型不正确,请使用void **
:
void **programCount = array;
然后你需要两次取消引用programCount
:
goto *programCount[0];
跳转到标签label2
或
goto *programCount[1];
跳转到标签label1
。
此处&&
运算符是GNU C label address operator。