free
特定のポインターを ing した後、セグメンテーション違反が発生します。
free(studentDB->name);
エラーや警告なしで値を取得できます。
printf("[DBG] studentDB->name: %s\n", studentDB->name);
しかし、私が言ったように、プログラムを解放しようとするとプログラムがクラッシュします。free
コマンドがセグメンテーション違反を引き起こす最も一般的な原因は何ですか?
free
特定のポインターを ing した後、セグメンテーション違反が発生します。
free(studentDB->name);
エラーや警告なしで値を取得できます。
printf("[DBG] studentDB->name: %s\n", studentDB->name);
しかし、私が言ったように、プログラムを解放しようとするとプログラムがクラッシュします。free
コマンドがセグメンテーション違反を引き起こす最も一般的な原因は何ですか?
あなたがそれをしなかったならmalloc()
、あなたはそれをすることはできませんfree()
。どこstudentDB->name
から来たの?
おそらく、すでに free() を実行しているか、ブロックの前の malloc 情報をバッファ オーバーランで上書きしています。
通常、プログラム内の別の場所でヒープが破損しています。通常、ヒープは連続しており、ヒープ マネージャーはヒープ ブロックをヘッダーで囲み、ブロックを追跡します。ブロックのヘッダーを上書きしても、アクセスは問題ありfree
ませんが、失敗する可能性が最も高くなります。
studentDB->name
以前に割り当てられましたか? そのフィールドにメモリを割り当てなかった場合、 を呼び出したときにfree
セグ フォールトが発生する可能性があります。malloc
そのフィールドをチェックして、 d またはdであることを確認してくださいstrdup
。
または、ヒープの他の場所に破損があること、それはあなたが正しく指摘したようにこれと一致しましたname
...の値を見ることができます
これがお役に立てば幸いです。よろしくお願いします、トム。
マンページから:
free( ptr ) は、ptr が指すメモリ空間を解放します。これは、malloc()、calloc()、または realloc() への以前の呼び出しによって返されたものでなければなりません。それ以外の場合、または free(ptr) が以前に呼び出された場合、未定義の動作が発生します。ptr が NULL の場合、何も実行されません。
次のことも確認できます。
からのセグメンテーション違反は、 で割り当てられていないか、既に 'd'free
されたポインターでそれを呼び出すことによって発生する可能性があります。malloc
free
studentDB->name
割り当てられたコードを投稿すると役立ちます。
また、studentDB が NULL の場合、studentDB ポインターの name メンバーにアクセスするとセグメンテーション違反になる可能性があります。