0

したがって、basicicc bob.cpp -o bobでコンパイルして実行すると、次のコードがsegfaultsします。

#include <string>

int foo () {
  return 6;
}

int main() {
  std::string t[foo()];
}

ただし、次の2つの同様のプログラムは正常に実行されているようです。

#include <string>

int foo () {
  return 6;
}

int main() {
  int f = foo();
  std::string t[f];
}

#include <string>

int foo () {
  return 6;
}

int main() {
  std::string t[6];
}

何が起こっているのか少し混乱しています。どうやら、可変長配列は非標準であり、私は常にそれをサポートするg ++を使用していたので、これは私にとって驚きでした。ただし、ICCでサポートされていない場合、なぜコンパイルされるのでしょうか。また、なぜ例2が「機能する」のでしょうか。

ここでの正しいコードは何ですか。最初のスニペットが正しくない場合、なぜコンパイルされ、次にセグメンテーション違反になるのでしょうか。

2011 x86_64 Intel(R)Core(TM)i5でicc(ICC)12.0.220110112を使用しています。

ありがとう

4

1 に答える 1

3

C ++には可変長配列がないことは事実ですが(C99にはあります)、コードが実際にコンパイルされるため(そして、2番目のスニペットが実際にクラッシュすることなく実行されるため)、ICCは拡張としてそれらをサポートしているようです。

最初のバージョンがクラッシュした場合、それはその非標準の拡張機能のICCの実装のバグであるに違いありません。

于 2011-03-31T15:58:00.157 に答える