11

以下のように、malloc を使用せずに同じジョブを実行できるのに、なぜ malloc を使用するのでしょうか。

#include <stdio.h>
#include <conio.h>

struct node {
    int data;
    struct node *l;
    struct node *r;
};

int main(){
    //Case 1
    struct node n1;
    n1.data = 99;
    printf("n1 data is %d\n", n1.data);

    //Case 2
    struct node *n2 = (struct node *) malloc (sizeof(struct node));
    n2 -> data = 4444;
    printf("n2 data is:%d\n",n2 -> data);
    free(n2);

    return (0);
}
  1. メモリ位置に初期化されていない n1 がデータ (99) を格納する方法を理解するのに苦労しています。
  2. ケース 1 を使用する場合とケース 2 を使用する場合。
4

5 に答える 5

4
int main() {
    struct node n1;
    n1.data = 99

これにより、スタック(mainのフレーム内) に のサイズに相当するスペースが確保されますstruct node。これはローカルと呼ばれ、 のコンテキスト内にのみ存在しますmain

struct node *n2 = (struct node *) malloc (sizeof(struct node));

これは、ヒープ上の割り当てです。このメモリは、現在の関数コンテキストに関係なく存在します。これは通常、「動的割り当て」と呼ばれます。

これらの構造は、ノードの追加、削除、並べ替えなどを自由に行うことができるリンク リストnodeの基礎となります。

以下も参照してください。

于 2013-10-10T06:40:59.203 に答える
3

最初のケースでは、メモリはスタックに割り当てられます。変数n1がスコープを超えると、メモリが解放されます。

2 番目のケースでは、メモリはヒープに割り当てられます。メモリ リソースを明示的に解放する必要があります ( で行っているようにfree)。

経験則として、サイズが制限されたローカルの一時データ構造にスタック割り当てメモリを使用することができます (スタックはコンピュータのメモリの一部にすぎず、プラットフォームごとに異なります)。永続化するデータ構造または大きいデータ構造にはヒープを使用します。

スタックとヒープをグーグルで検索すると、より多くの情報が得られます。

于 2013-10-10T06:38:26.997 に答える
1

通常、アプリケーションの実行前に必要なメモリのサイズがわからない場合は、malloc のみを使用します。

コードは正しいですが、メモリを動的に割り当てることはできません。測定値を node.date に保存したいが、測定値をいくつ取得するかわからない場合はどうすればよいでしょうか? 次に、測定ごとに新しいメモリを割り当てなければなりません。

実行前に (コードで直接) すべてのノードを定義すると、以前に定義したよりも多くのメジャーを保存することはできません。

c でリンクされたリストを検索すると、いくつかの良い例が見つかります。

于 2013-10-10T06:52:50.523 に答える