C++ pointer in if Bedingung?

4 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

Hier mal etwas Beispiel Code zum Verständnis:

#include <iostream>

using namespace std;

int main(void)
{
    int a = 1;
    int *p = &a; // p ist ein Zeiger und nimmt die Speicheradresse von Variable a entgegen

    cout << "Wert von p (Speicheradresse von (int)a): " << p << endl << endl;
    cout << "Wert von *p (das * vor dem p dereferenziert p = sorgt dafuer, dass der Wert von a wiedergeben wird) " << *p << endl << endl;
    cout << "Wert von &p (Speicheradresse von p): " << &p << endl;

    return 0;
}

Eine mögliche Ausgabe sieht dann so aus:

Wert von p (Speicheradresse von (int)a): 0x7fffdfd5c9cc

Wert von *p (das * vor dem p dereferenziert p = sorgt dafuer, dass der Wert von a wiedergeben wird) 1

Wert von &p (Speicheradresse von p): 0x7fffdfd5c9d0

Wenn also statt *p einfach nur nach p gefragt wird, wird im Prinzip die Speicheradresse (in diesem Beispiel 0x7fffdfd5c9cc) geprüft, ob sie true bzw. 1 entspricht. Das trifft natürlich in locker 100% der Fälle nicht zu (es gibt nämlich einen vom Kernel reservierten Bereich, auf den man nicht einmal als root Benutzer Zugriff hat, siehe Kernel Ring Buffer -2 und -1), und selbst wenn, wäre das Ergebnis nicht das, was erwünscht wird.

Ich habe es grade eben selbst probiert, gcc bzw g++ unter Ubuntu 16.04 (bei Bedarf sende ich genauere Infos) erkennt C++ diesen Fehler und "behebt" ihn vollautomatisch. Respekt an GCC, dass ist ein cooles Feature!

Ich bin allerdings (noch) kein C/C++ Profi oder Fortgeschrittener. @TeeTier wird da wohl relativ Zeitnah eine alles vernichtende Antwort raus hauen. Ich hoffe ich habe hier nicht allzu viel Müll erzählt. :-D


TeeTier  12.05.2018, 18:54
@TeeTier wird da wohl relativ Zeitnah eine alles vernichtende Antwort raus hauen.

Sorry, ich hab jetzt die nächsten Tage echt leider keine Zeit mehr, und deine Antwort auf die Frage hier sprengt den Umfang von meiner bei weitem.

Ich kann da jetzt leider nicht weiter drauf eingehen ... naja, bis nächste Woche dann! Viel Spaß noch beim Fragen beantworten! ;)

Wenn p auf eine Stelle im Code verweißt, die nicht als boolean-Wert interpretiert werden kann(Was eigentlich unmöglich ist), dann könnte das zu einem Fehler führen...

Im Grunde können dabei also nicht wirklich Probleme auftreten...Außer der pointer wird nicht als Pointer sondern als Variable gesehen...

Dann könnte es durchaus vorkommen, das der Wert nicht als boolean interpretiert werden kann...


Lamanini  12.05.2018, 16:14

p würde als true interpretiert werden, weil alles was nicht 0 ist, wahr ist.

Destranix  12.05.2018, 16:16
@Lamanini

Das ist korrekt...

Es könnte aber sein, dass der Compiler das erkennt und es verhindert...

Denn es ergibt ja wenig seinn, eine Adresse als boolean zu interpretieren...

Lamanini  12.05.2018, 16:19
@Destranix

Den Compiler hätte ich auch gerne. Das sind Fehler, die schnell mal passieren😂

Destranix  12.05.2018, 16:23
@Lamanini

Wer weiß...

vielleicht hat schon irgendeiner soeinen Compiler programmiert?

Und der lauert in den Tiefen des Internets, umzingelt von Gefahren, und vor Aller Augen verborgen...

Kieselsaeure  12.05.2018, 17:39
@Lamanini

jetzt wo du es sagst.. davon habe ich bereits gehört. ich hatte allerdings den "workaround" in c im kopf a la

#define true 1

#define false 0

Das kann natürlich bei CPP tatsächlich anders sein, wobei das irgendwie m.M.n. keinen Sinn hat.. :-(

Destranix  12.05.2018, 17:46
@Kieselsaeure

Und da haben wir ihn auch schon, unseren tief im Internet verborgenen Schatz, der umgeben von Gefahren vor aller Augen in den Kommentaren verborgen bleiben wird...

Leider...

Die Reihenfolge ist falsch. Vor dem Dereferenzieren ERST den Zeiger auf Gültigkeit testen. Das geht auch in Kombination, also so:

if (p && *p) {
  // p ist KEIN Nullzeiger und der Wert ist nicht 0-artig
}

Kieselsaeure  13.05.2018, 01:36

Oh, interessant. Diese Theorie hab ich völlig übersehen.

TeeTier  13.05.2018, 19:09
@Kieselsaeure

Ja, das ist eine gemeine Fehlerquelle. Ist mir früher auch immer passiert und ich hab mich über die Segfaults gewundert. :)

If(p) wählt den pointer aus, nicht das auf was der Pointer zeigt. Bringt in einer if abfrage nicht sonderlich viel und ist bestimmt nicht das, was man eigentlich machen will


IProxy  12.05.2018, 16:04

pointet auswählen ist falsch formuliert. zeigt p auf i, bekommst du bei p die speicherzelle von i.