0

これは私を困惑させました。構造がある場合:

struct MyType
{
  float *data;
}

そして、データにメモリを割り当てるための init 関数:

void init(MyType *s, int length)
{
  s->data = (float *)malloc(length*sizeof(float));
}

#define を使用して MyType の配列を宣言すると、期待どおりに動作します。

#define NUM_ELEMENTS 10
MyType myArr[NUM_ELEMENTS];
for (int i=0; i<NUM_ELEMENTS; i++)
{
  init(&myArr[i], 1000);
}

ただし、スタック上の変数を使用して配列を宣言すると、奇妙な動作が発生します。

int numElements = 10;
MyType myArr[numElements];
...

物事を混乱させるだけだと思う​​コードの詳細について説明せずに、動作が何であるかを説明するのは困難です。#define 変数とスタック変数の間を行ったり来たりすることで、それが機能するかどうかが決まることはわかっているので、どこかに問題があるのではないかと思います。

私の質問は次のとおりです。私が行っていることはすべて合法であり、それはうまくいくはずですか、それとも明らかに間違ったことをしていますか? スタック変数を使用して、実行時に構成値から配列サイズを定義できるようにします。

4

1 に答える 1

6

遅すぎるコメント より:

実際、私は -std=c++0x で g++ を使用しています。だから私はこれがC ++だと思います

それだけです。C++ では可変長配列 (VLA) を使用できません。これは C99 の機能です。

于 2013-04-18T20:17:46.200 に答える