SORU
17 EKİM 2014, Cuma


İlişkili tanımsız davranışı dışında genel bir dizi erişim?

Ben sadece sınıf benim bugün --- C okuma Kodu ve giriş sınavı vardı ve gereken cevabı eğer program çalışıyorsa ekranda görünecektir. Bir soru ilan a[4][4] gibi bir global değişken ve bir noktada bu program, çalışır erişim a[27][27], o yüzden cevap verdim gibi bir şey "Accessing an array outside its bounds is an undefined behavior" ama öğretmenim dedi a[27][27] bir değeri 0.

Daha sonra, 26* *"tüm başlatılmamış golbal değişken 4 ** ayarlanır" gerçek ya da değil. olup olmadığını kontrol etmek için denedim Evet, doğru gibi görünüyor.

Şimdi sorum şu:

  • Fazladan bir bellek gibi görünüyor temizlenmiş ve kodun çalışması için ayrılmış. Ne kadar bellek ayrılmış mı? Neden bir derleyici olması gerekenden daha fazla bellek ayırmak, ve ne için?
  • a[27][27] çevre için 0 olacak?

Düzenleme :

, a[4][4] bu kodsadeceglobal değişken ilan ve main() daha çok yerel yüzler vardır.

that code DevC tekrar denedim . Hepsi 0. Ama bu Vyktor işaret ettiği gibi en değer 0 ama rastgele bir değeri var VSE, doğru değildir.

CEVAP
17 EKİM 2014, Cuma


Haklıydın: tanımsız davranış ve her zaman 0 üreten. olamaz sayısıdır

Olarak neden görüyorsun sıfır bu durumda: modern işletim sistemleri için bellek ayrılamadı süreçlerinde nispeten iri taneli parçalar denilen sayfalar çok daha büyük daha bireysel değişkenler (en az 4KB üzerinde x 86). Tek bir global değişken varsa, bir yerlerde bir sayfa üzerinde yer alacak. a türü olduğunu varsayarsak int[][] ints sisteminizde dört bayt yaklaşık 500 bayt a başından itibaren yer alacak. Bu kadar a sayfanın başına yakın, a[27][27] gerçek bellek ile desteklenen ve okuma olacak eriştiği sürece sayfa hatası / erişim ihlaline neden olmaz.

Tabii ki, bu güvenmemelisin. Örneğin, a diğer genel değişkenler yaklaşık 4KB bulunuyorsa o zaman a[27][27] bellek tarafından desteklenen olacak ve süreci okumak için bir zaman kaza olacak.

Eğer süreci çökmesine bile değer 0 o zaman güvenemezsin. Hiçbir şey yapmaz ama bu değişken ayıran çok kullanıcılı işletim sistemi çok basit bir program var ve bu değer baskı, muhtemelen 0 göreceksiniz. İşletim sistemleri bir süreç hassas verileri veya kullanıcı başka bir sızıntı, böylece bir işlem için bellek teslim zaman bazı iyi huylu değer (genellikle sıfır) bellek içeriğini ayarlayın.

Ancak, okuma keyfi hafıza sıfır olacak genel bir garantisi yok. Bellek ayırma başlatılmış olmadığı bir platformda programınızı çalıştırabilir, ve dün onun kullanım için olanlar görür.

Eğer a sıfır değerleri için başlatılan yeterince diğer genel değişkenler izlediyseniz de, a[27][27] erişim orada ne olursa olsun, görürsün o zaman.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Kassem G

    Kassem G

    25 EKİM 2006
  • Ownage Pranks

    Ownage Prank

    13 AĞUSTOS 2007
  • Shameless Maya

    Shameless Ma

    24 Mayıs 2012