Uni aufgabe in c // Zeiger Pointer Adressen - Problem



  • /*
    Hey Leute ich habe in der Uni folgende Aufgabe (das steht noch mehr natürlich aber habe das rausgenommen was für memdump wichtig war falls ihr alles sehen wollt/ müsst bitte bescheid sagen)-->

    Sie haben bei der Arbeit mit dem SBC-Debugger ein Speicherabbild (Memorydump)
    kennengelernt. Schreiben Sie nun für den PC ein eigenes Programm zur Ausgabe
    eines Speicherabbildes auf der Konsole, dessen Funktionalität auf drei
    Funktionen abgebildet wird: main(), findstring() und memdump(). Mit Hilfe des
    Programmes soll es möglich sein, einerseits einen ASCII-Speicherdump eines
    dynamisch im Heap allozierten Speicherbereiches zu erzeugen und andererseits
    die Häufigkeit des Auftretens einer Teilzeichenkette im Speicher zu ermitteln.
    Die Funktion memdump() soll hierbei folgende Bedingungen erfüllen:
    + Funktionsparameter: die Größe und ein Zeiger auf die Startadresse des
    Speicherabbildes
    Prototyp: int memdump(int, unsigned char 😉
    + Ausgabe des Speicherinhaltes in Zeilen zu 16 Byte als druckbares
    ASCII-Zeichen
    + Jede Zeile soll mit einer durch 16 teilbaren Speicheradresse beginnen (Tipp:
    Niederwertigstes Nibble ist 0)
    + Die Anzahl der nötigen Ausgabezeilen ist dynamisch an die gewünschte Länge
    des Speicherabbildes anzupassen; die Anzahl der Zeilen soll als Funktionswert
    (Rückgabewert) zurück gegeben werden
    + Weitere Funktionalität soll die Funktion nicht besitzen

    ....

    Verwenden Sie ausschließlich Zeigervariablen zum Zugriff auf den Speicher.
    Denken Sie daran, den allozierten Speicher auch wieder freizugeben.

    ....

    Anmerkung: Die Benutzung einer Zeigervariablen sollte nie in der Form *(p + i)
    erfolgen, denn dann kann man auch gleich p[i] schreiben!
    Beachten Sie, dass strlen() die Länge einer Zeichenkette ohne ’\0’
    zurück gibt. Die tatsächliche Länge ist also immer strlen() + 1 !

    und dazu habe ich folgenden code -->>[code="c"]

    #include <stdio.h>
    #include <ctype.h>
    #include <string.h>
    int memdump(int größe, unsigned char *zeiger){
    int zähler =0;
    int zeile = 0;

    int anzahl=(strlen(zeiger)/16)+1; //abbruchkriterium !!

    printf("%d\n",anzahl);
    printf("ADDR 0123456789abcdef\n");
    for (int i =0; i<anzahl; i++){
    printf("%p\t", zeiger+i);

    for(int h =0; h<16; h++){
    if(isprint( *(zeiger+zähler))){
    printf("%c", *(zeiger+zähler));

    zähler++;
    }

    else{
    zähler++;
    printf(".");
    }
    }
    printf("\n");zeile++;
    }

    return zeile;
    }

    Meine Frage !!!! Wie kann ich anders auf die Werte zugreifen im Moment nutze ich ja *(zeiger+zähler). aber in der aufgäbe steht das ich das nicht so machen soll. kann mir bitte jemand helfen danke !!

    */



  • Das steht doch an derselben Stelle, wie man das macht: zeiger[zähler] (wobei ich das mit den Umlauten in Variablennamen nicht für eine großartige Idee halte.)



  • Bashar schrieb:

    Das steht doch an derselben Stelle, wie man das macht: zeiger[zähler] (wobei ich das mit den Umlauten in Variablennamen nicht für eine großartige Idee halte.)

    NE aber davor steht ja das wir das nicht über Arrays aufrufen dürfen also wir dürfen kein Zeiger[i] benutzen !!!



  • Nein, das steht da nicht!

    Du kannst aber auch den Zeiger erhöhen und darauf dann einfach per Dereferenzierung zugreifen.



  • Na wenn du das so genau weißt, wieso fragst du denn überhaupt erst?



  • Du sollst den Zeiger verändern. Z.B. mit zeiger++;



  • Th69 schrieb:

    Nein, das steht da nicht!

    Du kannst aber auch den Zeiger erhöhen und darauf dann einfach per Dereferenzierung zugreifen.

    Verwenden Sie ausschließlich Zeigervariablen zum Zugriff auf den Speicher.
    Denken Sie daran, den allozierten Speicher auch wieder freizugeben.

    ^^ das steht oben also ausschließlich zeigervariablen so meinte das auch der Doktor deswegen verstehe ich nicht so ganz wie das gehen soll



  • DirkB schrieb:

    Du sollst den Zeiger verändern. Z.B. mit zeiger++;

    Danke dir, und natürlich euch allen. Zeiger++ funktioniert tatsächlich. Wieso ich da nicht selber drauf gekommen bin


Anmelden zum Antworten