2017-01-08 4 views
0

Ich frage mich, warum meine Zuweisung funktioniert. Ich habe ptr erstellt, das ist ein Zeiger und ptr2 mit einem Zeiger auf dem gleichen Standort als ptr.malloc berührt nicht zugeordneten Speicher

Hier ist mein Code:

int* ptr = malloc(sizeof(int)); 
int* ptr2 = ptr; 
*ptr2 = 1; 
ptr2 = ptr+1; 
*ptr2 = 2; 

Am Ende habe ich eine Reihe von zwei Integer haben wie folgt aus:

ptr[0] = 1 
ptr[1] = 2 

Meine Frage ist: Warum kann ich den Wert 2-ptr2 beeinflussen, ohne Fehler oder Warnungen? Ich nur malloc() -ed für eine ganze Zahl in meinem Array, nicht wahr?

+2

Undefiniertes Verhalten ist * undefined *. – EOF

+1

Mögliches Duplikat von [Kein Fehler außerhalb der Grenzen] (http://stackoverflow.com/questions/9137157/no-out-of-bounds-error) – EOF

+0

Mögliches Duplikat von [Greift auf ein globales Array außerhalb seines gebundenen undefinierten Verhaltens zu? ] (http://stackoverflow.com/questions/26426910/is-accessing-a-global-array-outside-its-bound-undefined-behavior) –

Antwort

4

Das Problem hier ist, von

sagen
ptr2 = ptr+1; 

Sie zeigt auf aus gebundenen Speicher. Nach dem Aufrufen rufen Sie undefined behavior auf. Jetzt kann das Ergebnis von UB in keiner Weise gerechtfertigt werden.

Es gibt nichts in C inhärent, stoppt Sie von Zugriff von nicht-gebundenem (oder ungültigen) Speicher, aber das Ergebnis dabei ist UB.

Das heißt, nur ein Vorschlag, sollten Sie immer den Rückgabewert von malloc() überprüfen, bevor diese Zeiger mit UB zu vermeiden, indem dereferencing NULL Zeiger, bei malloc() Versagen.

+0

Danke für Ihre Antwort. Also, wenn ich es besser machen will, kann ich etwas wie "Realloc" verwenden? –

+0

@CallisteHanriat Das ist der richtige Weg. –

Verwandte Themen