Array mit NULL initialisieren



  • *ups*

    std::memset(cellPointer,0,26*sizeof(Cell*));
    

    sollte das natürlich sein

    und NULL muss laut Standard 0 sein! NULL ist doch AFAIK sogar deprecated (wobei ich gestehen muss, dass ich selber lieber NULL für Pointer benutze, da es IMHO verständlicher ist)



  • Dass man eine literale 0 in einen Zeiger casten kann, ist mir bewusst - ich verwende auch immer 0 statt NULL. Aber das heißt ja nicht, dass der Nullzeiger im Speicher auch wirklich nur aus 0en besteht. Das meinte ich mit 0x00; natürlich ist "int* p = 0x00" im Code auch der Nullzeiger. Aber reinterpret_cast<long>(p) muss nicht unbedingt 0l sein.



  • verstehe ich nicht, wieso soll man memset(NULL) statt 0 schreiben 😕



  • jaja, der nullzeiger.
    nicht vergessen es handelt sich dabei nur um einen konstanten integralen ausdruck (definiert in 5.19/3), der als 0 ausgewertet wird und in einem zeigertyp (den null zeiger dieses typs) konvertiert werden kann (solange es ein rvalue und eine integral constant expression ist)

    siehe dazu auch 4.9/1

    deshalb nützt es auch nichts, dem lieben fill_n NULL oder 0 zu übergeben, da damit
    fill_n <int*, int, (const) int> aufgerufen wird, und das dritte argument die auflagen nicht mehr erfüllt, implizit in einen null zeiger umgewandelt werden zu können.



  • DrGreenthumb schrieb:

    verstehe ich nicht, wieso soll man memset(NULL) statt 0 schreiben 😕

    der einzige sinn dahinter ist wohl, darauf aufmerksam zu machen, dass man ein array von zeigern initialisieren möchte, die alle auf adresse 0 zeigen sollen.



  • ja.. ich habe operator void so verstanden, dass es auf irgendwelchen wilden architekturen nicht funktionieren könnte wenn man 0 schreibt.



  • ja, weil nicht definiert ist, wie ein null zeiger wert für einen zeiger auf ein objekt aussehen muss, es ist nicht einmal garantiert, dass

    int *x = 0;
    float *y = 0;
    

    x und y auf der selben architektur tatsächlich nur durch 0en im Speicher dargestellt werden, bzw. dass x intern genauso wie y dargestellt wird.
    0 ist in erster linie aber eine ganzzahlige konstante und wird auch dementsprechend interpretiert.

    der standard sagt nur, dass ein "null pointer value" (= der (zeiger)wert für einen bestimmten typ, zu dem jeder ganzzahliger konstante ausdruck evaluiert wird) mit keinem anderen (zeiger)wert kollidiert.



  • 😕 😕

    muss ich memset jetzt NULL, oder darf ich auch 0, übergeben?



  • egal, beides evaluiert zu einem int, der 0 ist; damit ist die funktion nicht geeignet, zeiger auf ihren null zeiger wert zu setzen.



  • @DrGreenthumb
    wenn eine Architektur die NULL Pointer in wirklichkeit mit einem anderen Wert belegt, dann gehen beide Varianten nicht.

    std::memset(foo,reinterpret_cast<char>(reinterpret_cast<bar*>(NULL)),size);
    

    das könnte helfen, wenn das verwendete NULL-Muster sich nach einem ``char'' wiederholt 😉



  • Wie auch immer, ich hoffe, nullptr schaft es in den nächsten Standard.


Anmelden zum Antworten