Aşağıdaki Cı kodu vardır:C, niçin 0 int değişkenine başlattığımı neden "nm" tarafından başlatılmamış olarak bildiriliyor?
//declared at the beginning of the CAStar.c file:
int TERRAIN_PASSABLE = 1;
int TERRAIN_IMPASSABLE = 0;
int TERRAIN_SOME_WHAT_PASSABLE = 2;
I (başlatılmış) bir sıfır olmayan değere sahip ise bu değişkenlerin herhangi biri için, bu tip "D" olarak the "nm" command tarafından rapor fark ettik:
_TERRAIN_PASSABLE |00000008| D |
_TERRAIN_SOME_WHAT_PASSABLE|00000004| D |
Bununla birlikte, = 0 başlangıç o "B" (başlatılmamış) olarak rapor edilir:
_TERRAIN_IMPASSABLE |00000000| B |
neden başlatıldı" arasındaki fark 0 "ve" ile başka bir şeyle başlatıldı ama 0 "?
Sıfırla başlatılır. Derleyici, OS'den sıfırlanmış belleği beklediği için bir yığın değişkenini sıfıra sıfırlamadığı bir optimizasyon olabilir. bir tahmin olsa da. – ypnos
@ypnos Peki, dürüst olmak gerekirse, bu satırlar boyunca da düşündüm. Ama sonra, bu değişkenlerden birini gerçekten başlatılmamış halde bıraktım (sadece: "int TERRAIN_SOME_WHAT_PASSABLE;"). Değişkenin etrafındaki bu zaman, "C" olarak rapor edildi, yani (yine yine) 0 ile başlatıldıkça aynı değildi (ve aynı zamanda 0 ile başlatılmadıysa). –
Çünkü ld.so her şeyi sıfırlar. Uygulamanızın çalışma zamanı bellek ayırma (@ypnos) ile ilgisi yok - sadece çalışma zamanı bağlayıcısının değişkenleri özel bir şeye ayarlamak zorunda olmadığı anlamına gelir. –