0

次のコードがあります

#include <stdio.h>
#include <string.h>

int main()
{
  char a[10000] = "aaaaaaaa"; // this attribute may vary, so the length isn't going to be constant
  int aLength = strlen(a);
  int someParameter = aLength /4; // some attribute that's computed dynamically 

  char table[aLength][someParameter];
}

そして、テーブル宣言でエラーが発生します->「式には定数値が必要です」。どうすればこれを乗り越えることができますか?

4

4 に答える 4

7

古いバージョンの C (C89 など) では、可変長の配列を宣言できませんでした。変数が非常に大きくなり、すぐにスタックをオーバーフローする可能性があるため、一定でない配列サイズは物事を複雑にし、全体的にあまり有用ではありませんでした。

それにもかかわらず、可変長配列という名前で C (C99) に追加されました。したがって、過去には次のことしかできませんでした。

int array[CONSTANT_EXPRESSION];

ただし、C99 以降では次のことができます。

some_variable = whatever_expression();
int array[some_variable];

もちろん、可変長配列のサイズが正であり、大きすぎないように注意する必要があります。

したがって、2 つの解決策があります。1つは使用することC99です。つまり、コンパイラに C99 機能を有効にするように指示します。私が絶対にお勧めする2番目の解決策は、を使用することmallocです。

于 2013-09-18T09:01:48.830 に答える
2

C89 では、可変長配列は存在しませんでした。コンパイル時に利用可能な長さを提供する必要があります。

C99 では可変長配列が導入されたため、実行時に値を計算し、それらを使用して配列の次元を定義できます。

-std=c99gcc と vla でフラグ付きのC99 を使用します。または、以下のようなものを使用します。

char get_array (int d1, int d2)
{
  char **arr;
  int i;

  arr = malloc (sizeof (char *) * d1);
  for (i=0; i<d1; i++)
  {
    arr[i] = malloc (sizeof (char) * d2);
  }

  return arr;
}

そして解放へ

void free_arr (char **arr, int d1, int d2)
{
  int i;

  if (arr == NULL)
  { return; } /* caller's responsibility to assign NULL to
               * uninitialized arrays
               */

  for (i=0; i<d1; i++)
  {
    free (arr[i]);
  }
  free (arr);

  return;
}
于 2013-09-18T10:10:25.227 に答える