Was bedeutet “wilder Zeiger” in C?

Lesezeit: 5 Minuten

Kann mir jemand sagen, was der wilde Zeiger in C bedeutet, wie man ihn erhält und ist dieser in C++ verfügbar?

  • Wilde Pointer verwüsten gerne den Platz.

    – Tom

    6. April 2010 um 13:01 Uhr

  • das ist nicht wild, das ist wild…

    – AnthonyLambert

    26. April 2010 um 9:01 Uhr

  • Eines, das 3 Monate später immer noch herumläuft und wahllos herumstochert, während niemand es zum Beruhigen bringen kann.

    – Windows-Programmierer

    6. Juli 2010 um 5:49 Uhr

Benutzer-Avatar
Janks

Der Standard definiert oder verwendet den Begriff “wild”. Ich würde vorsichtig sein, die Meinungen anderer Leute darüber zu „korrigieren“, was es bedeutet, und ich würde es insbesondere vermeiden, zufälligen, nicht normativen Internet-Müll zu zitieren, um meine Position zu untermauern.

Für mich würde es einen Zeiger bedeuten, der weder auf ein legitimes Objekt verweist, noch NULL ist. Mögliche Quellen für diese Arten von Zeigerwerten können nicht initialisierte Zeigerobjekte, Objekte, die nicht mehr existieren, berechnete Zeigerwerte, falsch ausgerichtete Zeigerwerte, versehentliche Beschädigung des Zeigers selbst oder dessen, worauf er zeigte, usw. umfassen.

int main(void)
{

   int *p;  // uninitialized and non-static;  value undefined
   { 
      int i1; 
      p = &i1;  // valid 
   }            // i1 no longer exists;  p now invalid    

   p = (int*)0xABCDEF01;  // very likely not the address of a real object

   { 
      int i2;  
      p = (int*)(((char*)&i2) + 1);  // p very likely to not be aligned for int access
   }

   {
      char *oops = (char*)&p;  
      oops[0] = 'f';  oops[1] = 35;  // p was clobbered
   }
}  

und so weiter und so fort. Es gibt alle möglichen Wege, um einen ungültigen Zeigerwert in C zu erhalten. Mein Favorit muss der Typ sein, der versucht hat, seine Objekte zu “retten”, indem er ihre Adressen in eine Datei schrieb. Als er diese Zeigerwerte während eines anderen Programmlaufs zurückliest, zeigten sie seltsamerweise nicht mehr auf seine Objekte. Lust, das.

Aber das ist genau das, was wild für mich bedeutet. Da es sich nicht um einen normativen Begriff handelt, bedeutet er alles, was die Person, die ihn ausgesprochen oder geschrieben hat, gemeint hat. Fragen Sie ihn oder sie.

  • +1 für den Hinweis, dass der Begriff ungenau ist, und die Angabe von 4 möglichen Gründen.

    – Steve Fallows

    6. April 2010 um 12:01 Uhr

Benutzer-Avatar
Amal Sirisena

Ein wilder Zeiger in C ist ein Zeiger, der vor seiner ersten Verwendung nicht initialisiert wurde. Aus Wikipedia:

Wilde Zeiger werden erzeugt, indem die notwendige Initialisierung vor der ersten Verwendung weggelassen wird. Streng genommen beginnt also jeder Zeiger in Programmiersprachen, die keine Initialisierung erzwingen, als wilder Zeiger.

Dies geschieht meistens durch Überspringen der Initialisierung, nicht durch Weglassen. Die meisten Compiler können davor warnen.

z.B

int f(int i)
{
    char* dp;    //dp is a wild pointer
    ...
}

  • Der Begriff wird auch für einen Zeiger verwendet, der hatte initialisiert wurde, die aber mittlerweile zu einem Wildiesis-Toten wird. siehe Naveens Antwort: stackoverflow.com/questions/2583656/2583678#2583678

    – sbi

    6. April 2010 um 9:08 Uhr

  • @Magnus – Danke für die Bearbeitung! @sbi – Ich habe normalerweise Zeiger in dem von Ihnen beschriebenen Zustand als “baumelnde Zeiger” bezeichnet, aber Sie haben Recht, dass sie sich effektiv im selben Zustand wie ein “wilder Zeiger” befinden.

    – Amal Sirisena

    6. April 2010 um 15:26 Uhr

  • nicht ganz dasselbe – in vielen Systemen mit dynamischem Speicher scheinen die Daten, auf die ein freier Zeiger zeigt, gültig zu sein, bis sie wiederverwendet werden, während ein wilder Zeiger auf Datenmüll zeigt.

    – Peter Kirkham

    23. Juni 2010 um 9:08 Uhr

Es ist kein Standardbegriff. Es wird normalerweise verwendet, um auf die Zeiger zu verweisen, die auf eine ungültige Speicherstelle zeigen.
int *p;
*p = 0; //P is a wild pointer

Oder

int *p = NULL;
{
  int a;
  p = &a; // as soon as 'a' goes out of scope,'p' is pointing to invalid location
}

*p = 0;

  • Wenn der Ort, auf den der Zeiger zeigt, den Gültigkeitsbereich verlässt (oder freigegeben wird), wird er zu einem baumelnden Zeiger, nicht zu einem Wild. Ein wilder Zeiger ist einer, der nicht initialisiert ist.

    – Technisch

    6. April 2010 um 10:06 Uhr

  • @Technowise: Ich würde nicht zustimmen. Ich habe gehört, dass diese beiden Begriffe synonym verwendet werden.

    – sbi

    6. April 2010 um 12:02 Uhr

Um einen wilden (auch bekannt als baumelnden) Zeiger zu bekommen:

  • Erstellen Sie ein Objekt
  • Erstellen Sie einen Zeiger auf dieses Objekt
  • Löschen Sie das Objekt
  • Vergessen Sie, den Zeiger auf null zu setzen

Der Zeiger wird jetzt als “wild” eingestuft, da er auf ein beliebiges Stück Speicher zeigt und die Verwendung in diesem Zustand Probleme mit Ihrem Programm verursachen könnte.

Ein Zeiger, der nicht mit irgendeiner Adresse initialisiert ist, wird als wilder Zeiger bezeichnet. Es kann eine beliebige Mülladresse enthalten, daher ist das Dereferenzieren eines Wild-Zeigers gefährlich

Benutzer-Avatar
Nategans

Ein wilder Zeiger ist jeder Zeiger, der verwendet wird (insbesondere als L_value {dh (*pointer) = x } ), während er einen Wert hat, der entweder nicht richtig oder nicht mehr richtig ist. Es könnte auch verwendet werden, um die Verwendung von Speicher, der nicht als Zeiger definiert ist, als Zeiger zu beschreiben (möglicherweise durch Folgen eines Wild-Zeigers oder durch Verwendung veralteter Strukturdefinitionen).

Es gibt keine offizielle Definition. Es sind nur Wörter, die wir verwenden, wenn wir uns auf bestimmte Zeigerfehler oder die Ergebnisse dieser Fehler beziehen.

Benutzer-Avatar
Daniel

Wiki

Es ist ein Zeiger auf ein nicht initialisiertes Objekt oder ein Objekt mit einem schlechten Zustand. Die Verwendung dieses Zeigers führt zu Problemen. Das Wiki ist eine gute Quelle für Erklärungen.

  • Wenn ein Objekt seine Invarianten verletzt, kann man auch sagen, dass es sich in einem schlechten Zustand befindet, aber ein Zeiger darauf ist kein wilder Zeiger. Diese Definition ist also etwas falsch.

    – sbi

    6. April 2010 um 9:10 Uhr

  • Es kommt darauf an, welcher Art der schlechte Zustand ist. Aber ich verstehe Ihren Punkt, ich habe auf die Wiki-Seite für die genaue Definition verwiesen.

    – Dani

    6. April 2010 um 9:16 Uhr

  • Beachten Sie, dass die Sprache erfordert, dass der Zugriff über einen lvalue vom Typ unsigned char immer zum Lesen oder Schreiben auf ein Objekt verwendet werden kann, selbst wenn es sich in einem schlechten Zustand befindet, wenn es als deklarierter Typ interpretiert wird.

    – Janks

    6. April 2010 um 12:16 Uhr

1354070cookie-checkWas bedeutet “wilder Zeiger” in C?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy