3

1.メモリに格納されている2つの次元はどのように連続していますか?(つまり、動的割り当てではなく、int [M] [N]を意味します。つまり、int [M] [N]はスタック領域で発生したと思いますので、継続的ですよね?)

2.mallocによって割り当てられた領域は連続している必要がありますか?

3.メモリスペースを動的に割り当てる必要がない場合、どこで使用すればよいですか?スタックまたはヒープ。たとえば、char配列に10000文字を格納したいので、次を使用する必要があります。

char a[10000];

また

char *a = calloc(sizeof(char),10000);

「関数呼び出しスタック」は変数スタックと同じ領域にありますか??同じスタックにありますか、それとも異なりますか?

4

5 に答える 5

4

nにはint numbers[m][n]、メモリ内の連続したintがあります。たとえば、その後に。numbers[0][0]が続きnumbers[0][1]ます。

一方、n = 10とすると、その後に。numbers[m][9]が続きnumbers[m+1][0]ます。

malloc連続したメモリを返します。あなたはそれをどのように使うかを決める。

スタック上の10000バイトの配列は、関数が再帰的でない限り、また(Careyが指摘しているように)小さなスタック環境で開発しているのでない限り、問題ありません。埋め込み。

はい、コールスタックとローカル変数は同じです。

于 2013-02-22T19:20:16.327 に答える
1
  1. メモリは連続しています。1つのディメンションのすべてのアイテムが連続し、次のディメンションが続きます。

  2. はい。への1回の呼び出しで割り当てられるすべてのメモリmalloc()は連続しています。

  3. 大量のメモリが必要な場合は、動的に割り当てることをお勧めします。メモリを少なくするには、静的に割り当てることができます。ヒープを使用しますmalloc() 非常に少量のメモリを除いて、スタックはお勧めしません。

于 2013-02-22T19:16:59.980 に答える
1

あなたが何かを割り当てるとき[a][b]それは隣接していますか?

はい

タイルマップを使用したゲームを作成したときは、レンダリングでポインターを使用してタイルにアクセスすることもありました。

つまり、マップが10x10の場合、arrayName[14]たとえばを使用してタイル[1][3]をレンダリングします。

また、一部の場所では、[a]ではなく[b]が完全にメモリ上にあるという事実を使用することにも注意してください。これは、FORTRAN(CBLASなど)からのコードに依存している場合、またはいくつかの特定のデバイスと状況(いくつかの特定のドライバーを備えたいくつかのGPUなど)。

mallocを使用する場合、連続している必要がありますか?

はい。連続したメモリが利用できない場合は失敗します。メモリの断片化を考慮せずに、空きメモリの合計が存在するため、プログラムが機能することを期待することは非常によくある間違いです。

30MBのメモリを搭載しているのに16MBの画像を読み込めなかったために動作しなかったゲームを一度作成しました...コードによるメモリの断片化によって16MBのブロックが使用できなくなっていることに気づきませんでした。

動的割り当ての必要がない場合は、スタックまたはヒープを使用する必要がありますか?

Cでは、動的割り当ては通常、とにかくヒープ割り当てを意味します。初期のCの本ではmalloc、同様の関数ファミリー(calloc含まれている)はヒープ上でのみ動作すると明示的に述べています。自動割り当てはスタックを使用しようとします。

于 2013-02-22T19:19:03.117 に答える
0

Cは2Dアレイをサポートしていません。配列の配列と配列へのポインタの配列をサポートします。どちらも2D配列のように使用できますが、まったく同じではなく、どちらも実際には2D配列ではありません。

配列は連続したメモリ位置を占有します。したがって、配列の配列がある場合、各サブ配列は個別に隣接し、これらの配列はメモリ内に次々に配置され、全体が連続します。

配列へのポインタの配列がある場合、各サブ配列は個別に隣接していますが、サブ配列は互いに隣接している必要はありません。メモリ全体に分散している可能性があります。最上位の配列は連続していますが、サブ配列自体ではなく、サブ配列へのポインターのみが含まれています。

いずれの場合も、「2D」配列から単一の(行)サブ配列を取得できますが、列配列を取得する簡単な方法はありません。個別の配列を作成し、個々の行配列から値をコピーする必要があります。その形で欲しいなら。

于 2013-02-22T19:31:30.633 に答える
-1

1)正直に言うとわかりません。

2)はい、mallocによって割り当てられた領域は、仮想アドレス空間で隣接しています。これは、簡単な思考演習で推測できます。ポインターが与えられた場合、スペース全体を反復処理すると、常にポインターが1つインクリメントされ、有効なデータが取得されます。ただし、連続していない物理マッピングが返される可能性があることに注意してください。ただし、これはすべて、自分より下のレベル(つまり、オペレーティングシステムとプロセッサのTLB内)で処理されます。

3)通常、ヒープを使用します。特にスレッドを使用している場合は、一般的に大きなセグメントになります(つまり、実行したばかりのテストでは、pthreadのデフォルトのスタックサイズが8MBであることが示されました)。

3)の2番目の部分については、関数呼び出しスタックは変数スタックと同じです。変数を静的に(つまり、経由せずにmalloc)作成すると、それは含まれている関数のスタックフレーム内に存在し、もちろんスタック上に存在します。詳細については、のスタック規則を参照してください。

于 2013-02-22T19:20:19.347 に答える