5

パズルのような C コードがいくつかあります。このコードを使用する理由として、structオブジェクトがヒープまたはスタックで終了しているかどうかをどのように判断できるか疑問に思っています。

オブジェクトはまたはで作成されていません。彼らは配列の形で人生を始めます。この記事では、構造体 Emp を呼び出します。malloccalloc

Emp myEmp[6];

/* Each myEmp[?] item is populated in code */

オブジェクトはさまざまな方法でソートおよび操作され、ある時点でオブジェクトがコピーされ、配列ポインターに渡されます。コピーは を介し​​て行われmemcpyます。次に、オブジェクトは次のように配置されますEmp* emps_a[6]

オブジェクトはコピーから取得され、上記の emps_a に割り当てられます。

int i;
for( i = 0; i < n; i++ )
{
    emps_a[i] = myEmpsCopy + i;
}

これの一部または一部が私の質問に関係しているかどうかはわかりません。私は free() を必要としたり、メモリをクリーンアップしたりする必要はありません... 残念ながら、私は C についてあまり知りません。

助けていただければ幸いです。

4

1 に答える 1

17

グローバル変数とstatic修飾子で宣言された変数 (別のメモリ領域に割り当てられる) は別として、関数本体で宣言されたローカル変数はスタックに割り当てられますが、呼び出しmallocたものはすべてヒープに割り当てられます。また、C99 の可変サイズの配列と割り当てられたメモリは_alloca、スタックに配置されます。

int* x[10];   // The addresses are held on the stack
int i;        // On the stack
for(i = 0; i < 10; ++i)
   x[i] = malloc(sizeof(int)*10);  // Allocates memory on the heap

たとえば、上記のコードでint*は、ヒープ内の 10 の異なる場所へのアドレスを保持するスタックに値の配列があります。

于 2009-06-29T03:27:48.873 に答える