5

これは、この質問に関する質問です: What does (char *)0 mean in c?

そこでは、答えが正確に何であるかを説明することから少し離れた答えがありましたが、最終的な答えは、それがアドレス0の文字へのポインターであり、nullであると述べました。これは私に2つの疑問をもたらしました。

  1. c では、char* 9 を与えて、それがアドレス 9 へのポインターであると言えますか? エラーや警告は表示されませんか?

  2. (char*) 0 は確かにアドレス 0 の文字へのポインタですが、このアドレス 0 はどういう意味ですか? つまり、それがヌルであるとどのように言えますか? その場合、 (char*) 1 または (char*) 2 などの値はどうなるでしょうか?

編集:それが役立つかどうかにかかわらず、ここに置くだけです。この質問を最初に検索したのは、execlLinux システム コールの最後の引数が null で、かなり奇妙な構文 ((char *) 0) を見つけたときでした。

ありがとう。

4

1 に答える 1

17

(char *) 0「アドレス0の文字へのポインタ」ではありません。Cでは、 は特別な方法で処理されます。タイプのnull ポインター値(char *) 0を生成することが保証されています。正式には、オブジェクトを指していません。その実際の数値 (「アドレス」) は実装定義であり、任意のアドレスに対応できますが、必ずしも. たとえば、指定されたプラットフォームがこのアドレスをタイプのヌルポインター値用に予約している場合、address を「指す」ポインターを数値的に生成できます。しかし、言語の観点から見ると、null ポインター値は実際にはどこも指していません。char *char0(char *) 00xFFFFFFFFchar *

(char *) 9などの特別な意味はありません。生成されるポインタ(char *) 9も実装依存です。ほとんどの実装では、実際char *に address へのポインタが生成されます9

その特別な扱いを回避するために、次の(char *) 0ようなものを試すことができます

int i = 0;
(char *) i;

上記(char *) iは(実装にも依存しますが)通常、char *address へのポインターを生成します0。ここで特別な扱いを無効にする重要なポイントは0、式がもはや定数ではないという事実です。

于 2016-04-29T06:32:59.713 に答える