c - 跳转到标签时出现段错误

标签 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);
}

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

最佳答案

这个问题涉及一个 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/

相关文章:

c - 使用 UNION 和 STRUCTURE

linux - 使用 SIGALRM 和计时器时内存损坏

android - Activity 标签文本对齐

.net - 正确更新控件上的工具提示

c - 识别哪个逻辑核心是超线程的,哪个不是

c - VS2010 中包含目录优先级

c - 读取命令行参数

c - python 列表调整大小的实现中的错误?

c - 我怎样才能组装这个程序

Swift:将变量插入标签?