casten von nullzeiger



  • Folgendes Problem:

    "map" ist der Rueckgabewert von mmap (Memory Mapped I/O) und ein
    Nullzeiger. Es wird eine Datei im Speicher abgebildet.

    verkuerzte Version:

    int j, k;
    int ir[32];
    
    for(k = 0; k < 32; k++) {
    	*(map+j+k) = *(map+j+k) ^ *(ir+k); 
    	...
    }
    

    Jetzt kriege ich eine Meckermeldung vom Compiler, da ich einen Nullzeiger
    dereferenziere.

    Ich moechte den Speicherbereich (die Datei) als int einlesen und bearbeiten.
    Wie caste ich das richtig?

    Vielen Dank



  • Was du sagst, ergibt nicht so richtig Sinn. Meinst du vielleicht void-Zeiger statt Nullzeiger? In dem Fall kannst du map natürlich einfach als int-Zeiger deklarieren.



  • for(k = 0; k < 32; k++) {
        (int)*(map+j+k) = (int)*(map+j+k) ^ *(ir+k);
    

    funktioniert nicht. Kommt auch: warning: dereferencing `void *' pointer



  • Bashar schrieb:

    Was du sagst, ergibt nicht so richtig Sinn. Meinst du vielleicht void-Zeiger statt Nullzeiger? In dem Fall kannst du map natürlich einfach als int-Zeiger deklarieren.

    Ich dachte bis gerade eben, dass void-Zeiger und Nullzeiger das Gleiche ist.



  • du kannst einen void pointer nicht derefernzieren, denn es gibt keinen typ void.
    also:

    Bashar schrieb:

    In dem Fall kannst du map natürlich einfach als int-Zeiger deklarieren.

    und nicht vergessen bei mmap auf NULL MAP_FAILED zu prüfen



  • gary1195 schrieb:

    du kannst einen void pointer nicht derefernzieren, denn es gibt keinen typ void.

    Das sage ja nicht ich, sondern gcc.

    Danke fuer deinen Tip.



  • Bashar schrieb:

    Was du sagst, ergibt nicht so richtig Sinn. Meinst du vielleicht void-Zeiger statt Nullzeiger? In dem Fall kannst du map natürlich einfach als int-Zeiger deklarieren.

    Wie wuerde das typecasting genau aussehen bei meinem Beispiel? Danke.



  • gigg schrieb:

    Bashar schrieb:

    Was du sagst, ergibt nicht so richtig Sinn. Meinst du vielleicht void-Zeiger statt Nullzeiger? In dem Fall kannst du map natürlich einfach als int-Zeiger deklarieren.

    Wie wuerde das typecasting genau aussehen bei meinem Beispiel? Danke.

    Kannst du mal die Stelle zeigen, wo ich gesagt haben soll, dass du typecasten sollst? 😕

    int *map = mmap(...);
    if (map != MAP_FAILED) {
      map[j+k] = ... /* bissel hübscher als *(map+j+k) */
    }
    

    Wobei du nochmal checken musst, ob die Zeigerarithmetik so OK ist.

    Ich dachte bis gerade eben, dass void-Zeiger und Nullzeiger das Gleiche ist.

    Ganz und gar nicht. Das eine ist ein Typ, das andere ein Wert.



  • Fuer mich ist Programmieren nur Hobby, bin Autodidakt, kein Informatiker.

    Ich habe wahrscheinlich nur ein falsches Verstaendnis von manchen Begriffen manchmal.
    Aber ich lerne gern dazu. Vielen Dank fuer deine Muehe. Ich teste das gleich mal.



  • gigg schrieb:

    Fuer mich ist Programmieren nur Hobby, bin Autodidakt, kein Informatiker.

    Und du denkst, damit bist du hier allein?



  • Bashar schrieb:

    gigg schrieb:

    Fuer mich ist Programmieren nur Hobby, bin Autodidakt, kein Informatiker.

    Und du denkst, damit bist du hier allein?

    Oft habe ich den Eindruck, hier sind nur Informatiker (bzw. Studenten oder Schueler) unterwegs.



  • Danke, Bashar, das funktioniert. 🙂

    Und ich glaube, ich habe das mit den void-Pointern begriffen.


  • Mod

    gigg schrieb:

    Oft habe ich den Eindruck, hier sind nur Informatiker (bzw. Studenten oder Schueler) unterwegs.

    Ich denke, gerade die Informatiker sind hier eher eine Minderheit. Informatik != Programmieren. Außerdem dürften auch viele Leute (mindestens zu einem großen Teil) Autodidakten sein. Autodidaktik != lustloses Lernen.



  • Das war auch nicht irgendwie abwertend gemeint. Ganz im Gegenteil, ich mag dieses Forum.


Anmelden zum Antworten