2017-07-17 13 views
-2

私はこのコードを持っている:C |ポインタ|セグメンテーションフォールト

私の問題は、私はこの機能ma_init();を呼び出すたび、私はfooter->status = FREEにセグメンテーションフォールトを取得し、ということです。誰かが私をここに正しい方向に向けると、何時間かグーグルグーグルが起こってしまったので、私はこれを理解することができません。

編集:ヘッダファイル:unsigned char型のバイトのtypedef

+0

あなたの 'size size;'は数値が大きすぎるため、acutalサイズを保持できません。 – mch

+0

'mem_chunk_header :: size'のタイプは?それは 'size_t'ではいけませんか? – dhke

+0

@dhke質問で調整しました。これを質問に追加するのを忘れてしまった。ごめんなさい。 'size size'は' int'型です。 – Bobby

答えて

1

これは読めません。 <stdint.h>を含め、uint8_tを使用することを検討してください。

私の問題は、この関数をma_init()と呼びます。私はfooter-> status = FREEのセグメンテーションフォルトを取得します。

...デバッガ(gdb)を使用し、その後、すべての警告とを&デバッグ情報(GCCと例えばgcc -Wall -Wextra -gを...)コンパイルする

を学ぶしてくださいあなたはmem_poolのアドレスにheaderを初期化します。

その後、あなたはあなたがポインタheaderに追加するpointer arithmetic

mem_chunk_header * footer = header + header->size + sizeof(mem_chunk_header); 
// the + above are likely to be wrong 

(つまり間違っです)いくつか疑わしいので+は尖った要素サイズ(バイト数ではない)という点であるか、つまりsizeof(mem_chunk_header)の単位で、確かに少なくとも2であり、おそらくそれ以上です(私のLinux/x86-64デスクトップでは8です)。あなたのfooterは遠くにあります。

デバッガでは、(header,footer,mem_poolという値を照会することによって)気づいたでしょう。また、あなたがより良い(一般system calls)オペレーティング・システム固有のプリミティブをベースにしますよmemory allocatormallocラàコーディングしている場合、ところで

valgrindを使用してvirtual address spaceを修正することを検討してください。 Linuxではmmap(2)とお友達を使用します。ここでは右方向への

ポイント私はいくつかは、いくつかの時間

のためにグーグルの後にあなたはいくつかの良いCプログラミングの本を読ん週間を費やす必要が原因。あなたの場合、仕事の時間は十分ではありません。

+0

実際には、特にデバッガの使用方法を学ぶために、より多くの時間を費やす必要があります。 –