質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

Q&A

解決済

5回答

5080閲覧

どこを指しているかわからないヌルポインタ?

WoodenHamlet

総合スコア306

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

1グッド

0クリップ

投稿2015/12/04 00:24

編集2015/12/04 00:25

ヌルポインタ 【 null pointer 】

引用テキストヌルポインタとは、変数や関数のアドレスを格納するポインタ変数のうち、どのアドレスも指していない状態の変数のこと。実際の値は言語や処理系によって異なるが、0やランダムな値などが取られることが多い。宣言だけして領域の確保などを行っていない場合などがこれにあたり、ヌルポインタの指し示す領域に値を代入したり読み取ったりするとエラーや例外、あるいは予期しない動作を起こす。

IT用語辞典 e-Words から

Cではヌルポインタは「どこも指していないことを保障するポインタ」であり、「宣言だけして領域の確保などを行っていない場合」は単純に「どこを指しているかわからないポインタ」ではないのかと考えていて、すこし混乱しています。

つまり

C

1char *ptr; // ptr はヌルポイインタではない 2 3if (ptr == NULL) 4{ 5// ptr はヌルポインタではないので実行されない 6} 7 8ptr = NULL; // ptr はヌルポインタ 9 10if (ptr == NULL) 11{ 12// ptr はヌルポインタなので実行される 13} 14

Cだけが特別な定義をしているということでしょうか、私の理解が間違っているということでしょうか?

Chironian👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

「どこを指しているかわからないポインタ」は、「ダングリングポインタ」と呼ばれ、ヌルポインタとは別物です。

もっとも、C/C++以外の多くの言語では、ポインタ概念はあっても、数値からポインタへの変換やポインタを絡めた数値演算ができず、ダングリングポインタは発生すること自体が処理系のバグであるため、まず見かけることはありません。

投稿2015/12/04 00:48

maisumakun

総合スコア145121

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

WoodenHamlet

2015/12/04 01:07

なるほど、ダングリングポインタという用語は初めて聞きました。ありがとうございます。
退会済みユーザー

退会済みユーザー

2015/12/04 11:48

dangling pointer。勉強になりました。こんな言葉があるなんて知れませんでした。目からウロコです。この言葉を知っていたらもっと上手く説明できた事があったのに。
sharow

2015/12/04 12:22

dangling pointerは前まで有効なアドレスを指していたポインタが、誰かにそのアドレスを開放されてしまい、繋がっていた鎖が切られたように「ぶらさがる」からそう呼ばれます。 上の説明では不正なポインタはすべてダングリングポインタであるかのような誤解を与えると思います。
KiyoshiMotoki

2015/12/05 12:49 編集

ウィキペディアによると、sharow様が説明されているように ・参照していたアドレスが意図せず開放されてしまったポインターをdangling pointerと、 ・初期化忘れなどによる不正なポインターをwild pointerと 呼ぶようですね。 https://en.wikipedia.org/wiki/Dangling_pointer 「野生のポインター」とは、なかなか想像力をかき立てられる言葉ですw
guest

0

C言語のヌルポインタは「NULLマクロの定義値と等しいポインタ」のことであり、どこを指しているのか判らないポインタはヌルポインタではありません。ほとんどの処理系ではNULLマクロは0(C言語では(void *)0)が定義されています。そして、0は厳密にアドレス0という決まった場所を指しており、そこに対してアクセスしようとすると必ずアクセス違反となってエラーや例外が発生します。

e-Words の説明は一般化しすぎていてC言語には当てはまらなくなっていますね。
それに、C/C++以外では、そもそも「ポインタ」という変数のタイプが存在しない場合が多いです。

投稿2015/12/04 02:59

catsforepaw

総合スコア5938

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こんにちは。仰るとおり C言語やC++言語であれば

http://www.kouno.jp/home/c_faq/c5.html

  • ヌルポインターは、何も指していないことを保証されている。
  • 初期化されていないポインターは、どこを指しているかわからない。

References:
K&R1 Sec. 5.4 pp. 97-8; K&R2 Sec. 5.4 p. 102; ANSI Sec. 3.2.2.3; ISO Sec. 6.2.2.3; Rationale Sec. 3.2.2.3; H&S Sec. 5.3.2 pp. 121-3.

だそうです。

あえて言及するなら

c

1// ptr はヌルポインタではないので実行されない

c

1// ptr はヌルポインタとして初期化されていないので実行されない可能性がある

でしょうね。
char *ptr; の宣言が、自動変数ではなくグローバル変数として定義されていたら0で初期化されますので、ptr == NULL が真となります。

投稿2015/12/04 00:49

編集2015/12/04 00:51
hsk

総合スコア728

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

WoodenHamlet

2015/12/04 01:10

回答ありがとうございます。 そうなると、C 以外の言語ではまた違うのかも…?というような疑問も感じています。
hsk

2015/12/04 01:59 編集

なるほど... >宣言だけして領域の確保などを行っていない場合などがこれにあたり は、たしかに全処理系ですべからく当てはまる表現ではないですね。 ポインタは「変数」または「オブジェクト」の一種であることを考えると、変数やオブジェクトを宣言しただけのときの値に "== null" とできるかどうかは、変数やオブジェクトの初期化がどのように行われるか(あるいは不定であるのか)その処理系に因りますね。
guest

0

ベストアンサー

”どこを指しているかわからないヌルポインタ” という表現は変です。
ポインターの値が NULL のものを ヌルポインタ と呼びます。
どこを指しているかがわからないものは、不定アドレスと呼べばよいとおもいます。(正式な名前があるかもしれません。)

ポインター自体はかならず何らかの値を持っています。
その値をメモリー上のアドレスとして解釈したときに、プログラムコードの観点から正しいか? が重要です。

  1. ポインターの値を無効な値として管理しているもの

一般には NULL という値で表します。(0であることが一般的ですが、そうとは決まっていません)
参考:

...
ヌルポインタはどんなオブジェクトや関数のアドレスと比較しても等しくならない。
ヌルポインタはソース上では 0 である。
ヌルポインタの実際の値は0とは限らない。
ヌルポインタには NULL マクロを使える。
ヌルポインタはフラグ代わりに使える
...

  1. プログラムの管理下のもの

通常はこの状態のはずです。

  1. その他 (管理外)

プログラムのバグなどにより、管理外のメモリーのアクセスをしてしてしまうアドレスを指している状態です。
初期化していなくて、どんな値になっているかがわからない場合や、
配列の有効エリアを超えた場所を指している場合などがあります。

参考:

...
ダングリング・ポインタ(dangling pointer)
プログラムの実行中にポインタが不正なメモリ領域を指している状態。ポインタが宙ぶらりんな状態(dangling)であることから、ダングリング・ポインタと呼ばれる
...

投稿2015/12/04 13:31

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

考えられている通り、元の文が間違っていますね。
C言語で言うとグローバル変数の場合にしか当てはまらないですし、他の言語でもC言語と同様、ローカル変数として宣言されたポインタが宣言時にNULLで初期化される(=ヌルポインタ)ような言語は一般的ではないです。

また、

予期しない動作を起こす。

についても考えにくいですね(たとえ言語仕様で定められていなくても処理系で既定されているかと)。元の文は「どこも指していないことを保障するポインタ」「どこを指しているかわからないポインタ」の区別がついていない方が書かれたものであると考えられます。

話は少し逸れますが、(C言語は異なり、)最近は未初期化変数の参照はコンパイル時にエラーにしてしまう言語も一般的です。

C

1char *ptr; // ptr はヌルポイインタではない 2 3if (ptr == NULL) 4{ 5// ptr はヌルポインタではないので実行されない 6}

相当の処理を書くと、ptrが初期化されていないのでコンパイルエラーになり、そもそも実行できない、というわけです。こういう言語では「どこを指しているかわからないポインタ」が仕様上存在しないことになりますね。

投稿2015/12/04 02:23

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問