2

****C の新機能!****

Windows 7 (64 ビット ビルド) で Dev-C++ 4.9.9.2 を実行しています。コンピューターには 39GB の物理メモリがあります。

大きな二次元配列を作成しようとしています。ディメンションの数と、各ディメンションに含まれるアイテムの数を示すコードを既に作成しています。

例として、配列が 2 次元であるとしましょう: 長さ 100 万項目、幅 6 項目:

[1,2,3,4,5,6],
[1,2,3,4,5,6],
[1,2,3,4,5,6],
...and on to one million items.

私が試してみました:

float MyArray[1000000][6];

しかし、これは Dev-C をクラッシュさせます。次より大きい配列を初期化しようとすると失敗するようです。

float Myarray[86486][6];

それがこのサイトの名前なので、私を楽しませる「スタックオーバーフロー」が発生していると思います。

私は掘り下げてきましたが、Cが予約するメモリの量を理解できるようにmallocを使用する必要があるようです。これを使用して 1 次元配列をセットアップする方法の良い例を見てきましたが、これを 2 次元配列でセットアップする方法のサンプル コードを非常に高く評価します。

ここで例を見てきました: C で大きな 2 次元配列を初期化する

しかし、残念ながら、私は c の初心者であり、簡単な説明を理解できません。背景として: 私は、MyArray=[] を宣言するだけで (ほぼ) 任意のサイズまたは次元の配列を作成できる Python から来ています。

ありがとうございました!

4

1 に答える 1

3

ええ、個々のスタック フレームのサイズの制限に達しています。

1 つのアプローチを次に示します。

#include <stdlib.h>
...
int main(void)
{
  /**
   * declare myArray as a *pointer* to a 6-element array of float
   */
  float (*myArray)[6];
  /**
   * dynamically allocate space for 1 million objects of type
   * "6-element array of float"
   */
  myArray = malloc(sizeof *myArray * 1000000);
  ...
  myArray[i][j] = ...;
}

これが機能する理由:

添字操作a[i]は次のように解釈され*(a + i)ます。つまり、(配列のベースアドレス) の後のi'番目の要素 ( byte ではない) のアドレスを計算し、それを逆参照します。は の 6 要素配列へのポインタであるため、aafterの'番目の 6 要素配列のアドレスが得られます。myArrayfloatmyArray[i]ifloatmyArray

このアプローチの利点は、メモリが連続したチャンクで割り当てられ、myArray任意の 2 次元配列のように添字を付けることができることです。

于 2013-01-02T20:04:44.663 に答える