跳转到标签时出现分段错误

时间:2013-01-13 19:37:22

标签: c gcc label

嘿,下面的代码让我发疯,并在运行时给我一个分段错误。注意我在这里使用头等标签。

#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);
}

我不明白为什么会发生这种情况,它编写得很好......

2 个答案:

答案 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