3

変数は実際にどのようにメモリに格納されますか? たとえば、メモリのセグメントをmallocしてポインターに割り当てると言うので、これを尋ねます

int *p = malloc(10 * sizeof(int));

次に for ループを実行して、p を介して整数を割り当てます。これは、次のように int 変数を宣言してそれに整数を割り当てるのとは異なるようです。

int x = 10;

int をメモリに格納する必要があるというより明示的な宣言であるため、malloc では、ポインター演算を介してトラバースしているメモリのチャンクにすぎません。

ここで何か不足していますか?どうもありがとう。

4

5 に答える 5

0

C のように宣言された変数はint x = 10スタックに配置され、宣言されている関数が戻るまでのみアクセスできます (関数の外部で宣言されている場合はグローバルと呼ばれ、アプリケーションのランタイム全体で使用できます)。

mallocおよび同様の関数で割り当てられたメモリはヒープに配置され、明示的に解放される (例: を呼び出すfree(...)) か、アプリケーションが終了する (サーバーの場合は数週間/月/年かかる場合があります) まで、アクセス可能です。

スタックもヒープもメモリの一部ですが、主な違いは割り当て方法にあります。C では、*単項&演算子 と は 2 つの間の境界線をあいまいにすることができるため、たとえば のような宣言の場合は のようint x = 10にアドレスを取得できint* y = &x、同時に*y = 15ポインターの場合のように値を代入することもできます。 .

于 2013-08-22T12:26:56.620 に答える
0

1.配列サイズがわかっている場合。int array[10]より速く安全に使用できますint *array = malloc(10*sizeof(int))。実行前にサイズを知らなかった場合にのみ、必要mallocなものがあります。

2.スタックメモリint x = 10に 格納された宣言。xを宣言int *p = malloc(10*sizeof(int));するpと、スタック メモリに格納されますが、メモリpポインタはヒープに格納されます。

3. を使用するint *p = malloc(10*sizeof(int));と、関数はブロック メモリを割り当てます。適切なサイズのみが割り当てられます。実際、このメモリに必要な型を格納できますが、これを行うことはお勧めしません。

4. を使用するint x = 10と、変数がそのスコープ外に出た直後に、メモリが解放されます auto 。を使用する場合はmalloc、自分でメモリを解放する必要があります。そうしないと、メモリ リークが発生します。

于 2013-08-22T12:52:43.280 に答える