次のコードを実行すると、長い番号が表示されます。割り当てられていないintに値があるのはなぜですか?
int i;
int *p;
p= &i;
cout<<*p;
なぜ、割り当てられていないintに値がありますか?そしてその価値は何ですか?
次のコードを実行すると、長い番号が表示されます。割り当てられていないintに値があるのはなぜですか?
int i;
int *p;
p= &i;
cout<<*p;
なぜ、割り当てられていないintに値がありますか?そしてその価値は何ですか?
変数のメモリ位置(スタック内)の現在の内容i。
これはC++での「未定義の動作」の意味です。
「未定義の動作」は、「何かが可能です」を意味します。これには次のものが含まれます:
オブジェクトにはランダムな値があります。コードを実行するたびに、いつでも同じ、または異なることができます。
プログラムがクラッシュします。
お使いのコンピュータは、最新のJustin Bieberビデオをすべて再生します。停止する方法はありません。
あなたが知っているように、宇宙は終わりに来ます。
など...これは、「未定義の動作」の意味です。
スニペットにUBがある間、OPはポインタ*に値がある理由を尋ねました。 –
@TheodorosChatzigiannakis:タイトルとコードは、彼が実際に「int」について質問していることを明確にしています。最後の文章は、あまりにも言葉が貧弱です。 –
人はUBについてのそれらの不自然なジョークをやめてもいいですか? – Lumen
ポインタp
の値はint i
のアドレスです。アドレス:&
の演算子:p = &i
を割り当てました。 int i
自体は初期化されず、デフォルトとも呼ばれます。 *p
でポインタを逆参照すると、初期化されていないint i
の値が得られます。
int i
の値は、int
と解釈される初期化されていないメモリです。初期化されていない変数の使用は未定義の動作です。
また、あなたは、単に行うことによって、ポインタせずに同じ動作を持っているでしょう:私メモリ位置があるという理由だけで
int i;
cout << i;
多かれ少なかれ、初期化されていないローカルの値は、そのメモリ位置の残りのビットではありません。値は* indeterminate *です。それが不確定であるという事実は、あなたが最後に正しく述べるように、未定義の動作を引き起こすものです。コンパイラーに関する限り、初期化されていないローカル変数も存在しない可能性があります。 –
@TheodorosChatzigiannakisこれを指摘してくれてありがとう。私はそれに応じて答えを編集します。 – robsn
型が 'unsigned char'であれば、それはまだ不確定ですが、必ずしもそれを読むのはUBではないことにも注意してください。 –
は、(それがどのような値)いくつかの値を持っています。サムが指摘しているように、それは未定義の(そして望ましくない)行動の良い例です。
変数を空にすることはできません。
コンピュータの各バイトには常に何かが含まれています。
コンピュータプログラムでは、速度の理由からメモリをクリーンアップしないため、初期化されていない変数を残しておくと、この場所に残ったランダム(多かれ少なかれ)値があります。別のプログラムまたは私たち自身のコードによってメモリに格納されます。
通常は0または最近破棄された他の変数の値または内部ポインタです。
家を建てようとする土地を購入したいとします。土地を購入するには、地元の土地売り手に連絡してください。
あなたが必要とするどのくらいの土地の単位を彼に伝える必要があります。その代わりに、彼はあなたに土地の位置を教えます。
完了 - あなたの土地は使用可能です。しかし、何か気づいたのですか?土地売り手はあなたに土地の座標のみを伝えました。彼はその土地について何も言わなかった。土地には既に存在する家があるかもしれません。ホテルや空港もあります。何があるのか誰が知っていますか?あなたの家を最初に建てることなく、土地を使用しようとすると、そこに何があるか保証されません。土地所有者としての責任は、土地の上に何かを建設し、それを適切に使用することです。
C/C++は上記の例と同じです。 int
を尋ねるのは、8単位の土地を求めるようなものです。 C/C++はあなたに座標を教えてくれます。その土地に何が入っているのかは分かりません。あなたはその土地を使ってその上に家を建てる責任があります。あなたが家を建てておらず、 "家"に入ることを試みると、空港で終わるかもしれません。今すぐもっと鮮明になりたいと思っています:)。
未定義ですが、ほとんどの場合、それには何らかの問題が発生します。 – Thomas
なぜこれに 'p'を導入するのですか?あなたは 'int i;を投稿したこともできます。 cout << i; '。 – WhozCraig