6 Stimmen

Was passiert, wenn Sie einen Junk-Wert in C mit etwas initialisieren?

Angenommen, wir haben Folgendes:

int main(void) {
   char* ptr;

   printf("%c\n",ptr[24]);  // junk value

   ptr[24] = 'H';

   printf("%c\n", ptr[24]);  // prints H

   return 0;
}

Wenn ich den Junk-Wert in etwas anderes ändere, bedeutet das, dass ich den Speicher beschädige oder ist dieser Wert buchstäblich Junk, so dass es egal ist, welchen neuen Wert ich ihm zuweise?

6voto

datenwolf Punkte 154484

Ihr Programm stellt aus undefiniertes Verhalten was bedeutet: Es kann buchstäblich alles passieren und es ist immer noch von der Norm als unbestritten abgedeckt. Und wenn ich sage alles, dann meine ich das in vollem Umfang. Das würde sogar für Ihren Computer gelten, der empfindungsfähig wird und Sie die Straße hinunterjagt.

Nun, was in der Regel passiert, aber das ist nicht gerechtfertigt, ist, dass Sie in nicht zugeordneten Adressraum schreiben (auf einem modernen Betriebssystem mit ausgelagertem Speicher), was einen Segmentierungsfehler oder einen Busfehler verursacht (je nach Architektur, Betriebssystem und Laufzeitimplementierung).

ptr ist ein unitialisierter Zeiger, was bedeutet, dass der Wert des Zeigers noch definiert werden muss. Ein undefinierter Zeiger zeigt per Definition auf nichts und alles, d.h. auf kein gültiges Objekt. Die einzige Möglichkeit, diesen Zeiger gültig zu machen, besteht darin, ihm die Adresse eines richtigen C-Objekts des Typs zuzuweisen, auf den der Zeiger dereferenziert.

Übrigens: Plain C hat sehr, sehr strenge Typisierungsregeln. Ich behaupte manchmal, dass sie sogar strenger sind als die von C++, weil es keinen impliziten Konvertierungsoperator und keine Funktionsüberladung gibt. Aber die schlampige Typisierung und die schlechten Compiler haben seinen Ruf in Bezug auf die Typsicherheit ruiniert.

5voto

Naveen Punkte 71443

Sie greifen auf ungültige Speicherplätze zu, was ein undefiniertes Verhalten hervorruft. Es kann alles Mögliche passieren, es kann nicht vorhergesagt werden.

2voto

elitalon Punkte 8981

Da die meisten C-Implementierungen es erlauben, auf ungültige Speicherplätze zuzugreifen, ordnen Sie tatsächlich die 'H' Wert auf diese Position.

Aber man kann sich nicht darauf verlassen, was als Nächstes passieren wird. Vielleicht schlägt Ihr Programm fehl, vielleicht beschädigen Sie Speicher, der von einem anderen Programm verwendet wird, oder in einer Multithreading-Umgebung kann ein anderes Programm diesen Wert überschreiben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X