本ページは公開が終了した情報の複製であり、掲載時点での情報です。本ページに記載されている内容について各所に問い合わせることはご遠慮下さい。
サポート技術情報

[MSC]R6001 null pointer assignment の原因と解決方法

文書番号: 402080

最終更新日: 2004/04/27


この資料は以下の製品について記述したものです。


概要

この資料は、プログラム終了時に発生する以下のエラーの原因と解決方法について
説明したものです。
  C ランタイム エラー R6001 ( null pointer assignment )
  ヘルプやドキュメントの解説
   『 NULL セグメントの内容が、プログラムの実行中に変わりました。通常、NULL
      ポインタを使った不注意な割り当てのために、プログラムがこのエリアに書
      き込みました。...』
ヘルプをご覧になっていない場合は、ヘルプの内容についてもご確認ください。

詳細

NULL セグメントとは、コンパイラの著作権表示を含む、データ領域( DGROUP )の先頭 の特殊な目的用の領域です。この領域は、プログラムの実行の前後で調べられます。 プログラムがこの領域に書き込みを行うと終了後にエラーメッセージを表示します。 これは通常、NULL ポインタを超えての不法な書き込みが行われたということです。
このエラーの発生したプログラムは、正常に動いているように見えても、NULL ポイ
ンタを使用したデータの書き込みが行われているため、操作環境が変わると動作しな くなることがあります。特にメモリモデルをコンパクトやラージモデルにするとプロ グラムが暴走するなどの重大な問題が発生します。

再現プログラム

  #include    <stdio.h>
  char  *abc ;
  void main()
  {
      *abc = 'A' ;
      printf ( "%c\n", abc ) ;
  }

原因

いろいろな原因が考えられますが、すべて NULL セグメントにデータを設定することに より発生するものです。具体的には、上記の例のような初期化されていないポインタ 変数 (アドレス NULL) に対して、データの設定を行う場合などです。

対処方法

ソースコードで使用しているポインタ変数をすべて調べて、初期化されているかを確認 して下さい。上記の例では、ポインタ変数 abc を初期化せずにデータを設定してい
ます。この場合、次のように修正します。
  #include    <stdio.h>
  char        *abc ;
  char        buff ;            /*  実体となる変数を宣言 */
  void main()
  {
      abc = &buff ;             /*  ポインタ変数の初期化 */
      *abc = 'A' ;
      printf ( "%c\n", abc ) ;
  }
また別な方法として、NULL セグメントを調べる内部関数 _nullcheck を使用して
調べることもできます。しかしこの方法は高度な知識が必要になります。スタート
アップルーチンを充分にご理解頂いている方以外にはお薦め致しません。
  extern void _far _nullcheck ( void ) ;
この内部関数を使用すると、NULL セグメントにデータが書き込まれていると次のエ
ラーメッセージが表示されます。
run-time error R6001
  • null pointer assignment
この_nullcheck 関数に関しての、サポート、説明等は一切お受けできません。また 実行して発生した、いかなる障害も、弊社では責任を負いませんのでご了承ください。 Visual C++ 1.0、 C/C++ 7.0A、または C 6.0 をお使いのお客様は、スタートアッ
プルーチンに含まれている chksum.asm のファイルに _nullcheck 関数についての
ソースコードが記述されていますので参考にして下さい。

詳細

  • Visual C++ は、米国 Microsoft Corporation の商標です。

Keywords: KBINFO KB402080
Technology: kbAudDeveloper kbCCompPDS600DOS kbCCompSearch kbQC200 kbvc150 kbVCsearch kbZNotKeyword3 kbZNotKeyword8

inserted by FC2 system