2016-04-13 14 views
2

Bu yüzden profesörüm dersimi bu programı yürütmesini söyledi, bilgisayar belleğinde neler olduğunu gösteriyor. Ben koştuğumda, çıkış dosyam profesörün ilk 4 satırlık çıktı dosyasıyla aynı sayılara sahipti ve sonra da bundan sonra tamamen farklı sayılar vardı. Ama bu kesinlikle rastgele sayılar çekiyor gibi görünmüyor, çünkü çıktıların birçoğu 0'dur ve bir çoğu da benzer uzunluklarda çok sayıdadır. Bunu açıklayan var mı?Bilgisayar belleğinde neler oluyor?

#include <iostream> 
#include <fstream> // for files 
#include <cstdlib> // for exit 
#include <climits> // for INT_MAX etc. 
int main() 
{ 
using namespace std; 

ofstream outfile; 
outfile.open("Whats_in_computer_memory.txt"); 

cout << "In this program, we declare a small array and then use array syntax " << endl 
    << "to see what is in the computer's memory. " << endl 
    << " " << endl 
    << " " << endl 
    << " " << endl 
    << " " << endl 
    << " " << endl; 

int a[1]; 

int histogram[214749]; 

for (int i = 0; i < 214749; i++) 
{ 
    histogram[i] = 0; 
} 
cout << "&a[0] = " << &a[0] << endl 
    << "&histogram[0] = " << &histogram[0]<< endl 
    << " " << endl; 

cout << INT_MAX << endl; 

for (int i = 0; i < 1000; i++) 
{ 
    outfile << a[i] << endl; 
    //cout << INT_MAX/1000000 +a[i]/1000000 << endl; 
    //histogram[ a[i]/1000000 ]++; 
} 

for (int i = 0; i < 2 ; i++) 
{ 
    cout << histogram[ i ] << endl; 
} 


char dummy; 

cin >> dummy; 
return 0; 

}

+0

Programın çıkışı nedir? – user463035818

+0

Ne görmek istediniz? Bir dizinin sınırlarını geçiyorsun. Program size herşeyi gösteriyor olabilir. Açıkça yasadışı olan, ancak havalı olan şeyleri kullanarak "C++ ne kadar güçlü" olduğunu göstermeye çalışan profesörlerden biri mi? –

+6

Profesörünüz tanımlanmamış davranışlardan hoşlanıyor mu? – Chad

cevap

10

a bir eleman yer alır. Yani

for (int i = 0; i < 1000; i++) 
{ 
    outfile << a[i] << endl; 
    //cout << INT_MAX/1000000 +a[i]/1000000 << endl; 
    //histogram[ a[i]/1000000 ]++; 
} 

kısa sürede i >= 1 olarak undefined behavior olduğu anlamına gelir. Tanımlanamayan bir davranışınız olduğunda her şey olabilir, böylece artık neler olup bittiğine dair bir sebep yok. Programınızda etrafında bellek zero'd veya başka bir varsayılan değerine ayarlı değil özellikle bu -

+0

Çok daha iyi şimdi :) – SergeyA

7

Profesörün programınızın etrafında bellek alanı "şeyler" içerdiğini göstermek için çalışıyor.

Tahminen bu erişen bellek dışı sınırları Eğer herhangi bir değere sahip olacağını garanti ve buna göre değişkenler için başlangıç ​​için böyle bir ihtiyaç olarak değil bir başka noktaya bir parçasıdır.

Ancak; problemi, tanımlanmamış bir davranış olması için "bir dizinin sınırlarını aşarak erişilmesini" düşündüğümüzdür. C++ standardında tanımlanamayan davranışlar, "derleyici, bu durumu uygun gördüğü her şekilde ele alabilir" anlamına gelir. Çoğu derleyici, yakındaki bellek konumlarından size değer sunacaktır (bu basit bir işlemdir), ancak bunların yapılması zorunlu değildir.

Aynı şekilde, bazı derleyiciler agresif optimize dışı bırakabilirsiniz tanımsız davranış (a içine endekse kullanıldığında i 1'den büyük olamaz sonucuna vardılar ve uygun döngü ayarlama gibi): derleyiciler varsaymak serbesttirler (optimizasyon amacıyla) tanımlanmamış davranış programcı tarafından asla çağrılmaz. yakındaki eriş: tanımsız davranış hakkında daha fazla ayrıntı için this page from the LLVM project bakınız (out-of-sınırları hataları işleme konusunda aynı karar verdikten ++, Clang ekibi ve g hem "Yabani İşaretçiler ve Sınırlar dizisine erişen Out of dereferences" başlığı altında dikkat çekerek hafıza konumları; çünkü bu durumda yapılacak en basit şeydir.

İlgili konular