2016-07-29 5 views
-3

とmallocのクラッシュ/破損したヒープ私は私が作ってるんだ、2D LinkedListのための構造体を持っている:私は、Javaに慣れているのでC - ポインタ

struct Node 
{ 
    void *data; 
    struct Node *up, *left, *right, *down; 
}; 

を、私は、コンストラクタのふり機能を作りましたこれは次のようになります。それは第二段落にmallocラインに達したときに私のプログラムはをクラッシュ

struct Node* buildNode(void *data) 
{ 
    struct Node *node = malloc(sizeof(struct Node*)); // Program crashes here. 
    node->data = data; 
    node->up = NULL; 
    node->left = NULL; 
    node->right = NULL; 
    node->down = NULL; 
    return node; 
} 

malloc(sizeof(struct Node*))から*を削除すると、クラッシュして正しく動作しません。

これはなぜですか?私のbuildNode関数は単にNodeへのポインタを返すだけで、実際にはNode構造体を返していません。私が得たエラーは、ヒープが破損したと何か関係があり、C言語にいくぶん新しかったので、これがどういう意味なのか分かりません。

ありがとうございました!

答えて

9

この行:

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

は、それへのポインタを戻します(32または64ビットモードで構築しているかどうかに応じて4または8バイト)ポインタサイズのメモリブロックを割り当てています。これはあなたが望むものではありません。

返されるオブジェクトのメンバーにアクセスしようとすると、ヒットしているメモリが割り当てられた領域の範囲外であるため、のクラッシュなどの未定義の動作が発生します。また、ヒープを暗黙に破損する可能性があります。そのため、後でmallocを呼び出すとクラッシュする可能性があります。一方

: - あなたが望むものである

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

struct Nodeのサイズのメモリブロックを割り当てています。

これを使用する前に返されたポインタがNULLではないことを確認してから、正常に処理してください。メモリが不足した場合など、割り当てが失敗した場合はNULLが返されます。

Cは(Javaとは異なり)ガベージコレクション言語ではないことにも注意してください。割り当てたすべてのポインタに対してある時点でfreeを呼び出す必要があります。そうしないと、プログラムが終了するまでメモリは解放されません。

+0

多くの勉強の後、私はCについて多くのことを学びました。そして、あなたの最後の声明は「プログラムが終了するまでメモリが解放されません」と言われたことがあります。必ずしもそうではない。あなたは精緻化できますか?私が見ているところの多くは、あなたが忘れたかどうかにかかわらず、プログラムが終了したときにアプリケーションによって占められたスペースが解放されていると言います。 – Hatefiend

+0

これは正しいです。 OSがプロセス全体をクリーンアップすると、*プログラムが終了するまでメモリは解放されません。私はあなたが私とまったく同じことを言っていると思います。 – Baldrick

+0

ああ、申し訳ありません。「メモリが解放されないときに」メモリが解放されるまで、メモリは解放されません。 – Hatefiend