Struct Pointer auf 0 abfragen



  • Hallo.
    Folgendes Problem:

    in c++ kann ichja folgendes machen
    Object *obj = new Object()
    if (obj == 0)
    do sth

    in C:

    Struct *str;
    initStruct(str);
    if (str == 0)
    do sth

    das problem: str is bei mir immer 0x0....was mach ich da falsch? bzw geht die abfrage in C so überhaupt?

    lg



  • Willst du in einer Funktion einen Pointer verändern, so musst du einen Pointer auf diesen Pointer übergeben.

    void initStruct(Struct **str) {
      *str = malloc(...);
    }
    
    Struct *str;
    initStruct(&str);
    if (str == 0)
    do sth
    

    Oder alternativ mit Rückgabewerten arbeiten.



  • was willst du denn überhaupt machen?

    Object *obj = new Object() 
    if (obj == 0)
    //...
    

    du wirst hier nie in den if-zweig reinkommen... new gibt entweder einen (gültigen) pointer zurück oder schmeist eine exception (std::bad_alloc) - dieses verhalten kann man aber z.bsp. mit new(std::nothrow) umgehen...

    ansonsten schreib bei nem Vergleich besser nur if(obj) - ist imho übersichtlicher weil man sofort sieht, was passieren soll...

    falls du das objekt an eine funktion übergeben willst, solltest du zunächst überlegen, ob du jmd ermöglichen willst, einen Nullptr zu übergeben - falls dies nicht der Fall ist, dann nimm Referenzen (sind intern nichts anderes als pointer, aber mit ihnen kann man sehr viel besser umgehen). Falls du den Pointer ändern willst musst du ne Referenz auf nen Pointer übergeben (oder halt nen Pointer auf nen Pointer, aber das halte ich nicht für sinnvoll ^^)...

    bb



  • unskilled schrieb:

    ansonsten schreib bei nem Vergleich besser nur if(obj) - ist imho übersichtlicher weil man sofort sieht, was passieren soll...

    Ich finde zum Beispiel eine explizite Überprüfung auf Null übersichtlicher. Aber das ist Geschmackssache... 😉

    Killver schrieb:

    in c++ kann ichja folgendes machen
    Object *obj = new Object()
    if (obj == 0)
    do sth

    Nein.

    Entweder du benutzt std::nothrow :

    Object* obj = new (std::nothrow) Object();
    if (obj == NULL)
    {
        std::cout << "Fehler beim Allokieren aufgetreten." << std::endl;
    }
    

    Oder du prüfst auf Exceptions:

    try
    {
        Object* obj = new Object();
    }
    catch (std::bad_alloc& e)
    {
        std::cerr << "Exception beim Allokieren aufgetreten: " << e.what() << std::endl;
    }
    

    Aber da der Fehler in der Praxis kaum jemals vorkommt, ist das auch nicht allzu relevant.


Log in to reply