2016-05-20 4 views
0

Ich bekomme das Ergebnis für QuadrateIch bekomme ein unerwartetes Ergebnis für quadratische Array?

squares = [ 512, 1, 4, 9, 16, 25, 36, 49 ].

Ich weiß, dass ich die Grenzen meines Limits erreicht habe, aber woher kam 512? Können Sie mir alle einzelnen Schritte erklären, die mit dem Fehler zusammenhängen?

int main() 
{ 
    unsigned squares[8]; 
    unsigned cubes[8]; 
    for (int i = 0; i <= 8; i++) { 
     squares[i] = i * i; 
     cubes[i] = i * i * i; 
    } 
} 
+1

Wenn Sie Cubes [8] schreiben, schreiben Sie tatsächlich in Quadrate [0], da die Arrays im Speicher liegen. –

+0

oh ok danke mcuh schätze es. –

+0

siehe meine Antwort zu verstehen, warum * undefined Verhalten * Fragen nicht richtig beantwortet werden. – Haris

Antwort

1

Ich würde das gleiche sagen, wie alle sagen. Es ist undefined behavior und Sie sollten das nicht tun.

Jetzt würden Sie fragen, ob das undefined Verhalten der Grund für das ist, was passiert.

Ich würde sagen, Ja, wahrscheinlich.


Nun können Sie denken, dies ist eine einfache Flucht aus der Beantwortung der Frage.

Es mag sein, aber ..

Das Hauptproblem bei dieser Art von Frage, es sehr schwierig ist, den gleichen Fall neu zu erstellen und untersuchen, was es tatsächlich so, wie es tat verhalten. Weil undefined Verhalten, na ja, verhält sich in einer sehr undefinierten Art und Weise.

Das ist der Grund, warum Menschen nicht versuchen, diese Art von Fragen zu beantworten, und die Leute raten, weg von undefined Verhalten Territorium zu bleiben.

1

Sie Zugriff auf den Speicher über die Grenze

for (int i = 0; i <= 8; i++) 

sollte

for (int i = 0; i <8; i++) 

Denken Sie daran, unsigned squares[8]; können Sie rechtlich Zugang squares[0] bis squares[7]

Ich weiß, dass ich die Grenzen meiner Grenze erreicht habe, aber wo 512 kam aus.

Die Folgen der illegalen Speicherzugriff gemäß ISO/IEC 9899 undefined: 201x 6.5.10-> fn109

Zwei Objekte im Speicher benachbart sein können, weil sie neben Elemente sind ein größeres Array oder benachbarte Elemente einer Struktur ohne Padding zwischen ihnen, oder weil die Implementierung sie so platziert, obwohl sie nicht verwandt sind. Wenn vor ungültiger Zeiger Operationen (wie die außerhalb Arraygrenzen-Zugriffe) erzeugt undefinierten Verhalten, nachfolgende Vergleiche produzieren auch undefinierte Verhalten


Sie einen Debugger (sagen GDB) verwenden kann oder ein Instrumentierungs Rahmen (sag valgrind) um herauszufinden, woher der Wert kommt. Hier sieht 512 wie der Würfel von 8 aus, aber es gibt keine Garantie, dass Sie beim nächsten Lauf den gleichen Wert erhalten. Außerdem besteht die Möglichkeit, dass das Programm abstürzt.

+0

Ja, ich weiß, aber wo kam 512 her aus Neugierde, das Programm besser zu verstehen. –

1

Ich weiß, dass ich die Grenzen meiner Grenze erreicht

Dann Sie sollten die Folgen wissen, auch. Der Zugriff auf Out-of-Bound-Speicher ruft undefined behavior auf.

Bleiben Sie innerhalb des gültigen Speicherlimits. Verwenden Sie

for (int i = 0; i <8; i++) 
+0

so gab es zufällig 512? –

+0

@PrinceofPersia Ja, es ist UB. __Das nicht tun__. –