ものすごく基本的な疑問です。。。
「C言語FAQ日本語訳」http://www.kouno.jp/home/c_faq/
ここの「05.ヌルポインター」を見ると以下のような意味の記述があります。
「NULLポインタは他のどんなポインタの値とも区別可能で、有効なポインタと比較しても等しくなる事はない」
「ポインタを書くべき場所に書かれた定数0はコンパイル時にNULLポインタに変換される」
そこで以下のプログラムを Borland C++ 5.5 for Win32 でコンパイル・実行してみたところ、
p1 == p2
とりました。これって変ですよね?
p1 は明示的に定数0で初期化しているのでNULLポインタですが、p2 は演算の結果としてアドレス0番地を指しているので、NULLポインタでは無いですよね? これはコンパイラが間違っていると思って良いのでしょうか?
#include <stdio.h>
int main()
{
char *p1,*p2;
p1 = 0;
p2 = (char *)1;
p2--;
if(p1 == p2){
printf("p1 == p2");
}
else{
printf("p1 != p2");
}
return 0;
}
No.3ベストアンサー
- 回答日時:
規格上, 整数型からポインタに変換してよいのは次の 2つの場合に限られます:
1.もともとポインタであった値を十分な大きさの整数型に変換しており, それを元と互換なポインタ型に再度変換する場合.
2.整数型の値が定数の 0 であった場合.
これ以外の処理を行うようなプログラムは ill-formed であり, その動作は undefined である (= 規格はその動作について見放す) と規定されています. 従って示されたプログラムがどのように動作したとしても規格は一切関知しません.
ちなみに NULL ポインタと「アドレスの 0番地」は全く無関係です>#1 の人
No.2
- 回答日時:
K&Rに以下の記述があります(プログラミング言語C第2版 124ページより抜粋)
『Cでは、データを正しく指すポインタは0にはならないことを保証している』
すなわち、ご質問に書かれたプログラムの変数p2は『データを正しく指していない』のです。
つまり、プログラムが間違っているのです。
そもそも、よほど特殊な事情がない限り、ポインタ変数に絶対アドレスを代入するようなことはしてはいけません。
No.1
- 回答日時:
>p2 は演算の結果としてアドレス0番地を指しているので
アドレス0番地というのがそもそも「有効なポインタ」ではありません。「アドレス0番地==NULL」だということだと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 引数 戻り値のあるメソッド 3 2023/02/12 06:23
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# C言語: ポインタ 5 2022/06/01 08:33
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- 経済学 経済学のベルトラン均衡について教えてください。 4 2022/11/23 16:37
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語の関数と配列に関する質問
-
C言語のポインタに直接アドレス...
-
fopne で失敗する原因
-
【VC++2005(CLR)】マルチスレッ...
-
ポインタについて。
-
戻り値で構造体を返すことは可...
-
C言語の文字列?処理 strcpyやl...
-
Run-Time Check Failure #3とい...
-
セグメントエラー
-
LPSTR型の初期化について
-
sizeofについて
-
無効なポインタ操作のエラー
-
nullポインタを逆参照とは?
-
構造体の中の構造体
-
DLL<->VB間での受け渡し(文字...
-
init関数の意味
-
NULLとブランクの違い
-
C言語でのconstを返す関数
-
NULLポインタが0でない処理系と...
-
C++で関数ポインタから関数名を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語のポインタに直接アドレス...
-
C言語の関数と配列に関する質問
-
fopne で失敗する原因
-
init関数の意味
-
戻り値で構造体を返すことは可...
-
セグメントエラー
-
Run-Time Check Failure #3とい...
-
LPSTR型の初期化について
-
アプリを32bitから64bit移行
-
参照型で受け取った引数をポイ...
-
Cで作成したDLL関数をVBから呼...
-
関数ポインタの高速化のメリット
-
C言語でのconstを返す関数
-
NULLとブランクの違い
-
C++で関数ポインタから関数名を...
-
ハンドルはポインタか
-
ExcelVBAでのkernel32(64bit)
-
デバイスハンドルとは?
-
【なぜポインタを使うのか】
-
TCHAR文字列内の検索について
おすすめ情報