zeiger auf feld



  • Hi,
    habe folgenden code und das programm stürzt ab.

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char *argv[])
    {
      int (*ptr)[10];
      int *ptr2;
      ptr2=ptr;
      printf("%i\n",*ptr2);
      system("PAUSE");	
      return 0;
    }
    

    wenn ich das richtig verstanden habe dann zeigt ptr auf ein 10-elementiges feld, in dem int werte sind. also ist sizeof(*ptr) bei mir 40, da sizeof(int) auf meinem system 4 ist.
    ich möchte nun die werte ausgeben und lasse einen neuen zeiger ptr2 auch auf dieses feld zeigen. dadurch, dass kann ich ptr2 um 1 erhöhen, dadurch erhöht sich die adresse um 4 und ich kann somit die einzelnen werte des feldes adressieren.
    jedoch stürzt das programm immer ab. mir ist klar, dass ptr und ptr2 auf inkompatible typen zeigen, jedoch sind beides addressen und wenn ich richtig verstehe spielt der typ nur für die zeigerarithmetik eine rolle.
    warum funktioniert das nicht?



  • armin.h schrieb:

    mir ist klar, dass ptr und ptr2 auf inkompatible typen zeigen, jedoch sind beides addressen

    Und welche sind das genau? 😉

    Kleiner Tipp, dereferenzieren von uninitialisierten Zeigern erzeugt undefiniertes Verhalten.



  • wird ptr2 nicht durch

    ptr2=ptr;
    

    initialisiert? und ptr ist auch initialisiert.



  • armin.h schrieb:

    wenn ich das richtig verstanden habe dann zeigt ptr auf ein 10-elementiges feld, in dem int werte sind.

    Nein, ptr Zeigt auf das erste Element eines Feldes mit 10 Zeigern auf int Werte.



  • rohde.h schrieb:

    armin.h schrieb:

    wenn ich das richtig verstanden habe dann zeigt ptr auf ein 10-elementiges feld, in dem int werte sind.

    Nein, ptr Zeigt auf das erste Element eines Feldes mit 10 Zeigern auf int Werte.

    da muss ich widersprechen. ein 10-elementiges Zeigerfeld auf int-werte, wobei ptr auf das erste element also den ersten zeiger zeigt, würde so aussehen:

    int *ptr[10];
    

    (weil [] stärker bindet als 😉



  • ptr2 zeigt auf das erste Element desselben zehnelementigen int-Feldes auf das ptr zeigt.

    Da ptr auf nichts zeigt, zeigt ptr2 auf genausoviel.



  • hmm ok ich schildere meine vermutung wo mein denkfehler ist und ihr sagt ob es so ist 🙂
    ich dachte int (*ptr)[10]; erstellt nen zeiger UND reserviert speicherplatz für ein 10elementiges feld und lässt den zeiger darauf zeigen.
    aber anscheinend ist es, dass nur eine zeigervariable erstellt wird die in der lage ist auf solch ein feld zu zeigen. es gibt noch gar kein feld.
    ich müßte also erstmal ein feld erstellen und den zeiger darauf zeigen lassen dann würde der rest auch funktioneren.
    im gegensatz dazu wird bei int *ptr[10]; dieses feld auch erstellt.
    so?



  • char * a[10] -> Ein Feld von 10 Zeigern auf char.
    char (*a)[10] -> Zeiger auf ein Feld mit 10 char-Werten.
    Letzteres könnte also auf folgendes Feld zeigen:
    char b[10] = "123456789";
    a=&b;
    Anschließend kann man dann mit dem Dereferenzierungsoperator auf das Feld zugreifen:
    printf("%s\n", *a); // Ausgabe: 123456789



  • armin.h schrieb:

    aber anscheinend ist es, dass nur eine zeigervariable erstellt wird die in der lage ist auf solch ein feld zu zeigen. es gibt noch gar kein feld.

    Korrekt.

    armin.h schrieb:

    ich müßte also erstmal ein feld erstellen und den zeiger darauf zeigen lassen dann würde der rest auch funktioneren.
    im gegensatz dazu wird bei int *ptr[10]; dieses feld auch erstellt.

    Und nur dieses Feld. Einen Zeiger gibt es hier nirgends. Deshalb ist der Name ptr auch irreführend. ptr kann aber bei Bedarf implizit in einen Zeiger auf das erste Element des Feldes umgewandelt werden.



  • armin.h schrieb:

    ich dachte int (*ptr)[10]; erstellt nen zeiger UND reserviert speicherplatz für ein 10elementiges feld und lässt den zeiger darauf zeigen.

    😃

    schreib einfach

    int ptr[10];
    

    dann sollte es gehen. ein array ist in c nämlich bereits von haus aus ein zeiger auf einen "vorallozierten" speicherbereich.


Anmelden zum Antworten