2009-08-01 11 views
-1

誰でもこれを説明できますか?Cでのmalloc()関数

struct node 
{ 
    int data; 
    struct node * link; 
} 
main() 
{ 
    struct node *p, *list, *temp; 
    list = p = temp = NULL; 
    ......................... 
    ......................... 
} 

addbeg() 
{ 
    int x; 
    temp=malloc(sizeof(struct node)); 
    scanf("%d", &x); 
    temp->data=x; 
    temp->link = list; 
    list=temp; 
} 

これは、C言語でリンクリストにデータを入力するためのコードです。コードは完全ではありませんが、私はその目的のために十分だと思います。基本的にこれらの行をコーディングを説明してください:

temp=malloc(sizeof(struct node)); 

temp->link = list; 
list=temp;. 

答えて

9

malloc()は、この場合は新しいノード用にメモリを割り当てるために使用されます。あなたのコードで定義され

addbeg()機能は以下のん:

  1. 一時変数xを定義します。
  2. 新しいノードのためのスペースを割り当てます。
  3. 整数(%dコードをscanfに入力)を入力し、xに格納します。
  4. 新しく割り当てられたノードのデータフィールドに保存された値をxに格納します。
  5. 変数 'list'が指すリストの古い "head"を、新しく割り当てられたノードのリンクとして格納します。
  6. 新しいノードを変数 'list'に格納されたリストの新しいヘッドに設定します。

これは、整数のリンクリスト(http://en.wikipedia.org/wiki/Linked_list)の非常に基本的な実装です。

+2

コードは最終的に各割り当てのメモリが 'free()'で解放され、 'メモリリーク'や '小さな学習プログラムではそれほど重要ではないが、あなたは小規模の学習プログラムでもそれを正しく行う方法を学ぶことができます。 –

+1

'list'と' temp'がaddbeg()に渡されないか、またはmainの中でaddbeg()が定義されていない限り、彼のプログラムはとにかく動作しません。 –

+0

addbegは標準Cでmain内で定義することはできません。一部のコンパイラでは拡張子として許されていますが、有効ではありませんC. –

0

malloc関数は、新しいノードのためのスペースを割り当てます。

list = temp 

temp->link = list 

はその新しいノードリストの先頭になります。

0

1行目:リストの1つの追加ノードにメモリを割り当てます。

2行目:現在のリストをこの要素の後の続きとして接続します。

3行目:現在の要素をリストの先頭にします。

0

演算子 'sizeof'は、データ型のサイズを計算するために使用されます。 オペレータは、構造ノードに割り当てられるスペースの量を計算しました。 malloc - 新しい構造体にメモリを割り当てます。 mallocメソッドを使用してメモリを割り当てる場合は、無料のメソッドを使用してこのメ​​モリを解放する必要があります。

free(tmp); 

このメソッドを呼び出さないと、メモリリークが発生します。これは、Cで非常に重要です。

[演算子はsizeof]、彼らがメインで宣言されているので、[1] http://en.wikipedia.org/wiki/Sizeof

+0

sizeof(struct node)== sizeof(struct node *)+ sizeof(int)であるとは限りません。内部のパディングは違いを生むことがあります。 charとintを含む構造体を考えてみましょう。 –

+0

あなたは権利があります。それはルールではない。ご回答ありがとうございます。 –

0

一時、リストは、addbegには表示されません。彼らは、アドビに渡すか、メイン(グローバル、ヤック)の外に宣言する必要があります。