-1

ユーザースペースプログラムから動的に変更(追加および削除)されたノードのリンクリストがあります。ノードの割り当てが常にユーザースペースにある可能性はどのくらいありますか?

通常のリンクリストノード、

struct node {
  int x;
  struct node *next;
};

リストをトラバースすると、カーネルSIGSEGVがこのユーザースペースプロセスにシグナルを送信するため、この質問があります。また、新しいノードを作成するたびにNULLポインターチェックを実行しました。

SIGSEGVまた、プロセスがカーネルメモリにアクセスしようとすると、カーネルがシグナルを送信することも知っています。

4

3 に答える 3

2

SIGSEGVはセグメンテーション違反です。これが意味するのは、プログラムが、プログラムに割り当てられたメモリ範囲またはセグメント内にない領域のメモリにアクセスしようとしているということです。セグメンテーションは、人々が直接対処しなければならなかった醜いシステムでしたが、現在はそれほど多くはありません。今日のあなたにとっての意味は、コードがnullポインターまたは初期化されていない値のいずれかを参照している可能性が高いということです。

デバッガーをプログラムに接続し、SIGSEGVがスローされる原因となっているアドレスを確認する必要があります。表示されるとすぐに、0x0か、0xDEADC0DEなどのガベージ値になる可能性があります。

おそらく、ノード内のすべてのポインターを0x0に設定しているわけではありません。コンストラクター内でこれを行い、addNode()removeNode()関数を再確認して、ダングリングポインターがぶら下がっていないことを確認します。

于 2012-09-07T11:32:22.570 に答える
1

next=NULLを設定することを忘れないでください。ノードコンストラクター内、またはノード作成直後。はい、割り当ては常にユーザースペースで行われます

于 2012-09-07T11:09:39.680 に答える
1

ノードの割り当てが常にユーザースペースにある可能性はどのくらいありますか?

100%確実です。

リストをトラバースすると、カーネルはSIGSEGVシグナルを送信します

これは、la-la-landにアクセスしようとしているプログラムにバグがあることを意味します。

また、プロセスがカーネルメモリにアクセスしようとすると、カーネルがSIGSEGVシグナルを送信することも知っています。

SIGSEGVは、プログラムが禁止されたメモリにアクセスしようとしたときに送信されるPOSIX標準信号です。したがって、必ずしもカーネルメモリだけでなく、プロセスがアクセスできるスペース外の任意のメモリです。

于 2012-09-07T11:26:19.863 に答える