私はこのコードを持っている:C |ポインタ|セグメンテーションフォールト
私の問題は、私はこの機能ma_init();
を呼び出すたび、私はfooter->status = FREE
にセグメンテーションフォールトを取得し、ということです。誰かが私をここに正しい方向に向けると、何時間かグーグルグーグルが起こってしまったので、私はこれを理解することができません。
編集:ヘッダファイル:unsigned char型のバイトのtypedef
私はこのコードを持っている:C |ポインタ|セグメンテーションフォールト
私の問題は、私はこの機能ma_init();
を呼び出すたび、私はfooter->status = FREE
にセグメンテーションフォールトを取得し、ということです。誰かが私をここに正しい方向に向けると、何時間かグーグルグーグルが起こってしまったので、私はこれを理解することができません。
編集:ヘッダファイル:unsigned char型のバイトのtypedef
。
これは読めません。 <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プログラミングの本を読ん週間を費やす必要が原因。あなたの場合、仕事の時間は十分ではありません。
実際には、特にデバッガの使用方法を学ぶために、より多くの時間を費やす必要があります。 –
あなたの 'size size;'は数値が大きすぎるため、acutalサイズを保持できません。 – mch
'mem_chunk_header :: size'のタイプは?それは 'size_t'ではいけませんか? – dhke
@dhke質問で調整しました。これを質問に追加するのを忘れてしまった。ごめんなさい。 'size size'は' int'型です。 – Bobby