私は、次のCコードを持っている:Cでは、なぜ0に初期化された変数は "nm"で初期化されていないと報告されますか?
//declared at the beginning of the CAStar.c file:
int TERRAIN_PASSABLE = 1;
int TERRAIN_IMPASSABLE = 0;
int TERRAIN_SOME_WHAT_PASSABLE = 2;
を私は、彼らがゼロ以外の値を持っている場合は、これらの変数のいずれかのために、彼らはタイプ「D」(初期化)としてthe "nm" commandによって報告されていることに気付きました:
_TERRAIN_PASSABLE |00000008| D |
_TERRAIN_SOME_WHAT_PASSABLE|00000004| D |
ただし、0に初期化されるものを "B"(初期化されていない)として報告される:
_TERRAIN_IMPASSABLE |00000000| B |
なぜ初期化「との間の差0 "と" 0以外の何かで初期化 "?
OSからのゼロメモリを期待してコンパイラがヒープ変数を0に初期化しない最適化しかし、推測。 – ypnos
@ypnosまあ、正直言って私はkinddaも同様の行に沿って考えた。しかし、私はこれらの変数のうちの1つを実際には初期化しないようにしました(ちょうど「int TERRAIN_SOME_WHAT_PASSABLE;」)。変数の周りのこの時間は "C"と報告されたので、0で初期化した場合と同じではありません(0以外で初期化した場合と同じではありません)。 –
ld.soはすべてを0に初期化するためです。あなたのアプリケーションのランタイムメモリ割り当て(@ypnos)とは関係ありません。つまり、実行時リンカーが変数を特別なものに設定する必要はありません。 –