0
int array[5][3];

(明らかに)5x3の多次元C配列を作成します。ただし

int x = 5;
int array[x][3];

しませ。私はいつもそうなると思っていました。C配列について何がわかりませんか?定数でC配列の長さを定義することしかできない場合、これを回避する方法はありますか?

4

3 に答える 3

4

ANSI C (別名 C89) では、すべての配列次元はコンパイル時の整数定数でなければなりません (これには、 として宣言された変数は含まconstれません)。extern1 つの例外は、関数のパラメーター、宣言、初期化などの特定のコンテキストでは、配列の最初の次元が空の角かっこのセットとして記述できることです。例えば:

// The first parameter is a pointer to an array of char with 5 columns and an
// unknown number of rows.  It's equivalent to 'char (*array_param)[5]', i.e.
// "pointer to array 5 of char" (this only applies to function parameters).
void some_function(char array_param[][5])
{
    array_param[2][3] = 'c';  // Accesses the (2*5 + 3)rd element
}

// Declare a global 2D array with 5 columns and an unknown number of rows
extern char global_array[][5];

// Declare a 3x2 array.  The first dimension is determined by the number of
// initializer elements
int my_array[][2] = {{1, 2}, {3, 4}, {5, 6}};

C99 では、可変長配列(VLA) と呼ばれる新しい機能が追加されました。最初の次元は非定数にすることができますが、スタックで宣言された配列 (つまり、自動ストレージを持つもの) に対してのみです。グローバル アレイ (つまり、静的ストレージを持つアレイ) を VLA にすることはできません。例えば:

void some_function(int x)
{
    // Declare VLA on the stack with x rows and 5 columns.  If the allocation
    // fails because there's not enough stack space, the behavior is undefined.
    // You'll probably crash with a segmentation fault/access violation, but
    // when and where could be unpredictable.
    int my_vla[x][5];
}

C 標準の最新版である C11 では、VLA がオプションになっていることに注意してください。Objective-C は C99 に基づいており、VLA をサポートしています。C++ には VLA がありませが、C 実装で VLA をサポートする g++ などの多くの C/C++ コンパイラは、拡張機能として C++ の VLA もサポートしています。

于 2012-08-03T20:48:35.703 に答える
1
 int x = 5;
 int array[x][3];

はい、そうです。これは C99 の可変長配列です。array必ず C99 モードに切り替え、ブロックまたは関数スコープで宣言したことを確認してください。可変長配列は、ファイル スコープでは宣言できません。

于 2012-08-03T20:35:03.353 に答える
0

試す:

const int x=5;
int array[x][3];

あなたが言ったように、xは定数でなければなりません。そうでなければ、プログラムの途中でxの値を変更するとどうなるかを考えてください。配列の次元はどうなるでしょうか:(

ただし、定数を宣言すると、x の値を変更するとコンパイル エラーが発生します。

于 2012-08-03T20:39:53.373 に答える