malloc Allozierung geht verloren



  • Du kannst eine Referenz auf den Zeiger übergeben, damit dieser geändert wird:

    void fun(tim*& t)
    

    Ebenfalls geht ein Zeiger auf einen Zeiger, wobei du dann die Zugriffssyntax ändern musst (eine zusätzliche Dereferenzierung).

    void fun(tim** t)
    

    Übrigens muss die main() -Funktion sowohl in C als auch in C++ den Rückgabetyp int und nicht void haben.



  • Doppelter Zeiger war die Lösung.

    Wenn ich kein Betriebssystem habe, darf main auch void sein 😉

    Danke Euch!

    Grüße,
    Peter



  • haller.peter schrieb:

    Wenn ich kein Betriebssystem habe, darf main auch void sein 😉

    Nein, darf es nicht. Auch dann muss es int sein.



  • Was hat dann der Rückgabewert für einen Sinn?



  • haller.peter schrieb:

    Was hat dann der Rückgabewert für einen Sinn?

    Es ist im Standard so definiert, damit das Betriebssystem über den Status des Programms bescheid weiß. Ja, man geht tatsächlich davon aus, dass es ein Betriebssystem gibt! Unglaublich, oder? 🙄



  • Es gibt aber auch Systeme, die ohne Betriebssystem laufen, z.B. einige Microcontroller. Da macht der Rückgabewert keinen Sinn. Oder?



  • wenn man void macht, geht was kapudd?



  • nein, natürlich nciht



  • Doch, der Computer kann explodieren.



  • waslos schrieb:

    wenn man void macht, geht was kapudd?

    Ja, das ganze kompiliert nämlich nicht.



  • haller.peter schrieb:

    Es gibt aber auch Systeme, die ohne Betriebssystem laufen, z.B. einige Microcontroller. Da macht der Rückgabewert keinen Sinn. Oder?

    Sinn machen kann es so und so nicht - wenn überhaupt kann es Sinn ergeben 😛



  • Athar schrieb:

    Ja, das ganze kompiliert nämlich nicht.

    Bei mir schon.

    Und ja, es kann was kaputt gehen! Die Gatter können durchbrennen ⚠



  • Seriously schrieb:

    Athar schrieb:

    Ja, das ganze kompiliert nämlich nicht.

    Bei mir schon.

    Und ja, es kann was kaputt gehen! Die Gatter können durchbrennen ⚠

    Das einzige, was hier kaputt geht, ist die Geduld der Forumsteilnehmer 😉



  • unskilled schrieb:

    Sinn machen kann es so und so nicht - wenn überhaupt kann es Sinn ergeben 😛

    Blödsinn. Seit ich von Lessing (18. Jahrhundert) diese Formulierung gesehen habe, glaube ich nicht mehr an das Märchen vom neuen bösen Anglizismus.



  • Wie dem auch sei, im C++-Standard ist explizit festgehalten, dass main einen int zurückgeben muss.

    ISO/IEC 14882:2003 3.6.1 (2) schrieb:

    An implementation shall not predefine the main function. This function shall not be overloaded. It shall have a return type of type int, but otherwise its type is implementation-defined. All implementations shall allow both of the following definitions of main:

    int main() { /* ... */ }
    

    and

    int main(int argc, char* argv[]) { /* ... */ }
    

    (... es folgt eine Beschreibung von argc und argv ...)

    Von Rechts wegen darf ein C++-Compiler "void main" nicht akzeptieren.



  • seldon schrieb:

    Wie dem auch sei, im C++-Standard ist explizit festgehalten, dass main einen int zurückgeben muss.

    ISO/IEC 14882:2003 3.6.1 (2) schrieb:

    An implementation shall not predefine the main function. This function shall not be overloaded. It shall have a return type of type int, but otherwise its type is implementation-defined. All implementations shall allow both of the following definitions of main:

    int main() { /* ... */ }
    

    and

    int main(int argc, char* argv[]) { /* ... */ }
    

    (... es folgt eine Beschreibung von argc und argv ...)

    Von Rechts wegen darf ein C++-Compiler "void main" nicht akzeptieren.

    Ich kann nicht so gut Englisch. aber sagt "but otherwise its type is implementation-defined" nicht genau das Gegenteil, also daß sehr wohl anderes gemacht werden darf, aber dann die Sache halt implementation-defined wird?
    Also kein absolutes void-Verbot mehr und kein Kreuzzug und keine Heilige Inquisition, wenn das jemand geschrieben hat?



  • Frage: Warum in C++ malloc und nicht new?

    Zu

    int main() { /* ... */ }
    

    ist das ja in einigen Compilern so umgesetzt, das das normalerweise folgende:

    return
    

    entfallen kann, da der Compiler in dem Fall weiss was er machen sollte.

    Dann steht alle Implementationen sollten folgendem Muster folgen:

    int main() { /* ... */ }
    

    So weit meine recht freie Interpretation 😉

    Wie schrieb Volkard: Komma können Leben retten 😃

    MfG f.-th.



  • Okay Satzzeichen und eventuelle Missinterpretationen 😡 😃

    Mit "in dem Fall" ist gemeint, wenn nicht ein anderer Rückgabewert des Programms von der Umgebung gefordert ist.

    Hoffe nun sind alle Klarheiten beseitigt 😕



  • volkard schrieb:

    Ich kann nicht so gut Englisch. aber sagt "but otherwise its type is implementation-defined" nicht genau das Gegenteil, also daß sehr wohl anderes gemacht werden darf, aber dann die Sache halt implementation-defined wird?

    Bin auch kein Englisch-Master, aber meiner Auffassung nach steht da, dass die main-Funktion int zurückgeben muss, aber darüber hinaus ihr Typ von einer konkreten Implementation vorgegeben werden kann. Das ist die Lesart für "shall", die bei technischen Spezifikationen wie z. B. RFCs gilt.

    [was hier stand war Unsinn und steht deshalb jetzt nicht mehr hier]

    Also kein absolutes void-Verbot mehr und kein Kreuzzug und keine Heilige Inquisition, wenn das jemand geschrieben hat?

    Statt dessen Folterung und langsamer Tod.



  • "but otherwise" == "aber ansonsten".

    Das heißt, main muss int zurückgeben, aber welche Parameter sie entgegennehmen kann, ist implementationsabhängig - es müssen halt nur mindestens die beiden angegebenen unterstützt werden.

    Beispielsweise findet man häufig die dritte Form

    int main(int argc, char *argv[], char *envp[]);
    

    in der ein Array von Umgebungsvariablen als envp mitgegeben wird.


Anmelden zum Antworten