次の例は、この問題を示しています。
#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;
}
}
最初は、「remaining」変数の初期化に少し時間がgoto
かかり、以前は 1 行で初期化していました。ただし、この例では、行にセグメンテーション違反が発生し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
許可されていない場合、警告が表示されますか?