1

簡単なコードを友達に説明しようとすると、奇妙なことが起こります。

#include <stdio.h>
int main() 
{
    int x;
    printf("%x\n",x);
}

私は何百万回も試しましたが、x の最後の 12 ビットは常に 0xff0 であることが判明しました。コードを破棄しましたが、ここで何が起こっているのかまだわかりません

私のオペレーティングシステムはubuntu10.10で、コンパイラはgcc4.7.2です

4

4 に答える 4

6

初期化されていない変数の読み取りは未定義の動作です。したがって、何も保証されません。

これには、常にゼロ、常に偶数、常に異なる、ハード ドライブの再フォーマットが含まれます。

于 2012-12-07T17:21:03.790 に答える
4

まず、値が常に0xFF0と一致する場合、「下位12ビット」はその値であり、下位3ではありません。

これが発生する理由については、初期化していない変数を読み取っています。これは未定義の動作であり、これを実行しようとすると、クラッシュからピザの配達まで、何かが起こった可能性があります。

しかし、実際に発生するのはこれです。xが参照する場所には、以前に保持していたデータが含まれています。セットアップでは、その変数に、下位12ビットが0xFF0であるデータが含まれている可能性があります。この場合、システムが呼び出される前にシステムによって実行された作業中に、以前のシステムコールに関連付けられたデータである可能性がありますmain

簡単に言うと、変数を使用する前に変数を初期化し、初期化されていない変数がその値を持っている理由を尋ねないでください。

于 2012-12-07T17:44:03.527 に答える
2

プログラムはdeterministicであるため、値は常に同じです。

初期化されていない変数の値は公式には「未定義」ですが、常にまったく同じ手順を実行するプログラムでは、予測可能である可能性があります。この場合、main の前にそのレジスタまたはスタック スロットを使用していたものは、表示されている値を必要としていたことがわかります。

プログラムが決定論的でない唯一の場合は、非決定論的なもの (ユーザー、変更可能なファイル、ネットワークなど) と相互作用する場合です。ただし、スレッド化されたプログラムは、外部からの刺激がなければ非決定論的である可能性があります。

于 2012-12-07T17:43:20.897 に答える
0

私はそれが均一ではないことを発見しました、最後の3ビットは常にであることがわかります

おそらく、スタック上のその場所に格納されていた以前のものは、ヒープに割り当てられたメモリへのポインタの値、またはそのようなものです(ヒープに割り当てられたブロックは、多くの場合、境界、たとえば8バイトの境界に丸められます)。

于 2012-12-07T17:52:50.817 に答える