0

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

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

我不明白为什么会这样,它编译得很好......

4

2 回答 2

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)。请注意,在评估指针的值之前,您需要使用预增量来增加指针。

免责声明:我不赞成goto在 C 或 C++ 中使用标签。还有其他语言元素可以为此类问题提供更合适的解决方案,例如@jweyrich 编写了指向函数的数组。由于这是不可移植的,它不应该在现实生活中使用(如果我是代码审查员,它不会通过审查;-))

于 2013-01-13T19:57:05.737 回答
1

的类型programCount 不正确,请使用void **

void **programCount = array;

那么您需要取消引用programCount 两次,例如:

goto *programCount[0];

跳转到标签label2,或

goto *programCount[1];

跳转到标签label1

这里的 &&操作符是 GNU C标签地址操作符

于 2013-01-13T19:58:42.690 回答