以下示例演示了该问题:
#include <cstdio>
int main()
{
unsigned int remaining=1;
goto loop;
while(remaining) {
unsigned char tmp[remaining];
printf("&tmp: %p\n",tmp);
loop:
remaining = 512;//or something else;
}
}
最初,“剩余”变量的初始化有点长,我曾经goto
在一行上初始化它。但是,现在这个例子给出了printf
在线分段错误。
看起来数组没有正确初始化。
甚至 gdb 也无法打印 tmp 数组的地址:
Program received signal SIGSEGV, Segmentation fault.
0x00000000004005b8 in main () at test.cpp:11
11 printf("&tmp: %p\n",tmp);
(gdb) p tmp
$1 = 0xfffffffffffffe00 <error: Cannot access memory at address 0xfffffffffffffe00>
我的 gcc 版本:
gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2
编译:
g++ -o testc test.cpp
如果我删除 goto,或者用固定数组替换可变参数数组,分段错误就消失了。究竟发生了什么?
这是一个 gcc 错误吗?如果goto
不允许和可变参数数组组合,应该有警告吗?