23505


Segmentation Faultとはなんですか？スタックオーバーフローと違いはありますか？

<https://stackoverflow.com/questions/2346806/what-is-segmentation-fault>  
(あと↑これ普通にコピペしただけでここのリンクと同じように扱われないの？（メタ的内容）)

英語版では  
Segmentation Faultとはなんですか？C/C++でのその定義はどうなっていますか？Dangling pointer都の関係性はありますか？  
といったところでしょう。

最後に、  
Segmentation Fault←これカタカナでどう書いたらいいですか  
Dangling pointer←これカタカナでどう書いたらいいですか

【追記】  
自分で調べたこと  
Segmentation Faultはメモリアクセスによて起こされるエラーの一種です。

<https://stackoverflow.com/questions/17997228/what-is-a-dangling-pointer>

Dangling pointerはデータが無効またはポインタそのものが無効なポインタのことといっている気がします。


CC BY-SA 3.0
2016-03-27T10:22:01.537
23503
2016-03-27T20:26:34.340
2017-05-23T12:38:56.083
-1
10455
question
c++ c
Segmentation Faultとはなんですか？


> Segmentation Faultとはなんですか？

使用しているシステム(主にCPUと言うか、そのCPUの採用するメモリ管理機構)により細部には違いがありますが、メモリの特定の領域に対するアクセス違反が検出された時に発生する例外(割り込みと言ったほうがいいかもしれません)をSegmentation
Faultと総称して(元はUnix用語でしょう)いて、次のような場合に発生します。

  * メモリが割り当てられていない領域にアクセスしようとした(*)
  * 書き込みが禁止されている領域に書き込もうとした
  * 実行が禁止されている領域のコードを実行しようとした

(* デマンドページングとかは一旦無視しておきます。)  
言葉自体は、メモリ管理方式上の([ページング方式](https://ja.wikipedia.org/wiki/%E3%83%9A%E3%83%BC%E3%82%B8%E3%83%B3%E3%82%B0%E6%96%B9%E5%BC%8F)に対しての)[セグメント方式](https://ja.wikipedia.org/wiki/%E3%82%BB%E3%82%B0%E3%83%A1%E3%83%B3%E3%83%88%E6%96%B9%E5%BC%8F)から来ていると思われるのですが、segmentという言葉自体は「(細分化された後の個々の)部分」と言う意味があるので、ページング主流の時代になっても生き残っているのでしょう。

> スタックオーバーフローと違いはありますか？

両者は異なる概念です。スタックオーバーフローはSegmentation Faultの原因の大きな一つですが、Segmentation
Faultはそれとは独立した概念です。メモリ保護機構がないシステムの場合、スタックオーバーフローが発生してもSegmentation
Faultが発生しないまま(いろいろな領域を壊して)実行が続くこともありますし、スタックオーバーフロー以外の様々な要因によってもSegmentation
Faultは発生します。

「最後に」はこちらのサイトで扱うトピックとは言い難いように思いますので、パスしておきます。


CC BY-SA 3.0
2016-03-27T11:29:34.997
23505
2016-03-27T13:26:48.730
2016-03-27T13:26:48.730
5793
13972
23503
answer


Dangling pointer というのは、「元々は有効だったが、参照しているオブジェクトがなくなってしまったので無効になったポインタ」のことです。

最初のリンク先の例をそのまま借りますが、

[code]

    char *p = NULL;
    {
        char c;
        p = &c;
    }
    // Now p is dangling
    *p = 'a';     // dangling pointer へのアクセス
    
[/code]

中のブロックで `p = &c;` は問題ありません。`c` は、まだ有効で、したがって、そのアドレスも当然有効だからです。しかし、ブロックの外の `*p
= 'a';` では、既に `c` はなくなっており、したがって、`p` が持っている `c` へのアドレスは無効になっています。これが dangling
pointer です。

イメージとしては、もともと二つのもの (ポインタ変数とオブジェクト) をつないでいたロープが、片方 (オブジェクト) が外れてしまったために、もう一方
(ポインタ変数) だけで、ぶらぶら、ぶら下がっている (= dangling) 状態です。


CC BY-SA 3.0
2016-03-27T20:26:34.340
23517
2016-03-27T20:26:34.340
3605
23503
answer