Pointer auf zweidimensionales char-Array



  • hallo,

    ich hab bisher hauptsächlich mit normalen char-Arrays gearbeitet.
    z.b.:

    #include <stdio.h>
    void printOneString(char *string)
    {
         while((*string))
         {
              putchar((*string));
              string++;
         }
    }
    

    nun würde ich das Ganze allerdings mit einem zweidimensionalen char-Array machen, und zwar wie hier im beispiel, indem immer der Pointer um 1 erhöhrt wird.

    Die Funktion soll mit printf alle Strings aus dem zweidimensionalen Array ausgeben. Ich versteh nicht genau, was ich da inkrementieren muss.

    mein bisheriger Ansatz:

    void printStrings(char **strings)
    {
    	while(*strings)
    	{
    		printf("%s\n",strings);
    		strings++;
    	}
    }
    

    funktioniert leider nicht richtig. könnt mir mal jemand sagen, wie das Beispiel richtig heißen muss?

    und das zweite Problem, das ich mit dem zweidimensionalen Array hab:

    char **test={"test1","test2","test3"};
    

    hier gibt der Compiler Warnungen aus. warum?



  • void printStrings(char **strings)
    {
    	while(*strings) /* solange der Zeiger nicht auf NULL zeigt */
    	{
    		printf("%s\n",*strings);
    		strings++;
    	}
    }
    
    char **test={"test1","test2","test3"}; /* definiert einen Zeiger auf einen char-Zeiger und initialisiert ihn, das ist hier natürlich Unsinn */
    
    char *test[]={"test1","test2","test3",NULL}; /* Array von Strings mit abschließendem NULL(Zeiger) */
    oder
    char *test[4]={"test1","test2","test3"}; /* Array von Strings mit abschließendem NULL(Zeiger) */
    


  • Zunächst mal zur Ausgabe.

    strings ist ein Doppelzeiger auf char. %s bei printf erwartet aber einen Einfachzeiger auf char. ALso musst du ihn dereferenzieren:

    printf("%s\n",*strings);
    

    Was du da machen willst ist ein Array von char-Pointern.

    char *test[]={"test1","test2","test3", NULL};
    

    Das NULL brauchst du, damit das while(*strings) auch beendet wird.

    Ein echtes 2D-Array wäre übrigens:

    char test[][10] = {"test1","test2","test3"};
    

    Aber das funktioniert nicht mit deinem printStrings .

    Das nächste mal wäre es nett, wenn du die Meldung vom Compiler gleich mit angibst.



  • Danke für eure Antworten!



  • hallo,

    ich hab wieder ein problem mit pointern.

    es geht um pointer auf structs:

    printf("%s\n",struct1->struct2->string);
    

    wie muss ich hier dereferenzieren?



  • Ohne die structs zu kennen ist das schwierig.



  • mhh.. naja, es ist halt ein pointer in einem struct auf ein anderes struct, in dem ein char-pointer ist.

    ist es überhaupt möglich, irgendwie zu dereferenzieren? ich habs versucht mit:

    printf("%s\n",struct1->struct2->(*string));
    

    aber das geht nicht.



  • Wenn der string vom Typ char[] oder char* bekommst du so ein char.
    %s möchte aber ein char* haben.

    printf("%s\n",struct1.struct2->string);	
    // oder vielleicht
    printf("%s\n",struct1->struct2.string);
    

    Ohne Glaskugel oder Definition der structs schwierig.



  • ??? ich verstehe nach wie vor nicht, warum hier keine allgemeingültige lösung möglich ist. beide deiner vorschläge funktionieren nicht.

    // test.h
    typedef struct{
    	char array[4];
    } STRUCT_2;
    
    typedef struct{
    	STRUCT_2 *struct2;
    } STRUCT_1;
    
    // test.c
    #include <stdio.h>
    #include "test.h"
    #include <string.h>
    int main()
    {
    	STRUCT_1 STruct,*pointer;
    	pointer = &STruct;
    
    	strncpy("test",pointer->struct2->array,4);
    
    	printf("%s\n",pointer.struct2->array); // funktioniert nicht
    
            printf("%s\n",pointer->struct2.array); // funktioniert auch nicht
    
    	return 0;
    }
    


  • Na überleg doch mal selbst. Also, was ist denn das "->" hm?
    Ich denke wie man auf member einer struct zugreift weisst du, nämlich mit dem Punktoperator
    struct.member
    hast du nen Zeiger auf einstruct musst du dereferenzieren und dann zugreifen
    (*pointer_to_struct).member
    dafür kannst du auch schreiben pointer_to_struct->member ... voila

    Nun geht es weiter, du willst was mit dem Member machen. Das ist in deinem Fall wieder ein Pointer auf ein Struct mit einem Member, an den du rann willst.
    pointer_to_struct->member = pointer_to_another_struct
    pointer_to_another_struct->member
    Und zusammen
    pointer_to_struct->pointer_to_another_struct->member

    Bei dir also
    pointer->struct2->array

    Edit: Das pointer->struct2.array nicht geht solltest du schon daran erkennen, dass struct2 ein pointer ist. Und ein Pointer hat keine Member da ein Pointer keine Struktur ist, somit ist der Punktoperator sinnlos.
    (Das gilt auch für pointer.struct2->array ... pointer kein struct)

    Edit2: Ich seh gerade, bemerkenswerter weise hast du bei strncpy alles richtig gemacht
    ("alles" bezieht sich hier auf die Derefernzierung, das Speicherproblem besteht natürlich :))



  • "Funktioniert nicht ist eine echt besch.... Fehlerangabe.
    Ist es ein Compilerfehler? Welcher?
    Laufzeitfehler?
    Woher sollen wir wissen, ob die Angabe (Zeiger auf Zeiger auf...) auch richtig umgesetzt ist?

    Aber deine Fehler liegen ganz woanders.
    1. gibt es nirgends Speicher für eine STRUCT_2 (worauf struct2 in pointer/STruct zeigen soll)
    2. wird struct2 nicht initialisiert
    3. benutzt du strncopy falsch
    4. selbst wenn du strncopy richtig benutzt, bleibt kein Platz mehr für die '\0' und somit gibt es keine gültigen Werte für printf("%s");

    Und wenn du das geregelt hast, ist pointer->struct2->array richtig.

    Du bist dir nicht sicher ob das die richtig Angabe für den String ist, benutzt das aber schon bei strncpy. So kannst du das nicht überprüfen.



  • könntet ihr mir nicht mal richtig helfen?

    ich mein, danke für die antworten, aber damit kann ich jetzt nicht wirklich was anfangen. DirkB, du hast vor einigen Posts diese Beispiele gebracht.

    außerdem wird struct_2 sehr wohl initialisiert:

    // ...
    typedef struct{
        STRUCT_2 *struct2; // <-- !?!
    } STRUCT_1;
    

    das mit dem '\0' ist gewollt.
    mag sein, dass printf nicht richtig funktioniert, aber eigentlich soll dieses char array auch nicht für printf sein, sondern für eine andere funktion, die dieses nullbyte nicht braucht.

    aber hier mal die compilermeldungen:
    [quote="gnu c-compiler"]
    test.c: In function 'main':
    test.c:11:32: error: request for member 'array' in something not a structure or
    union
    [code="c"]



  • Was du dsa hast ist ein typedef. Das belegt noch nicht einmal Speicher.
    Wo wird diesem struct2 ein Wert zugewiesen?
    Das ist ein Zeiger der auch auf eine sinnvolle Adrese zeigen muss, damit du ihn benutzen kannst.

    Sowohl ich, als auch ScottZhang haben dir die richtige Antwort gegeben.

    #include <stdio.h>
    #include <string.h>
    
    typedef struct{
        char array[4];
    } STRUCT_2;
    
    typedef struct{
        STRUCT_2 *struct2;
    } STRUCT_1;
    int main()
    {
        STRUCT_1 STruct,*pointer;
        STRUCT_2 derText = {"Hal"};  // Hier wird Speicher für die Struct2 belegt
    
        pointer = &STruct;
        pointer->struct2 = &derText;  // Hier wird der Zeiger initialisiert.
    
        strncpy(pointer->struct2->array,"tes",4);  // strncopy richtig
    
    //    printf("%s\n",pointer.struct2->array); // funktioniert nicht
    //    printf("%s\n",pointer->struct2.array); // funktioniert auch nicht
    
        printf("%s\n",pointer->struct2->array); // funktioniert und wurde genannt
    
        return 0;
    }
    


  • Hilfe zur Selbsthilfe:

    Mit dem was hier gesagt wurde und der Fehlermeldung des Compilers sollte es reichen wenn du jetzt einfach mal dein Gehirn einschaltest.

    Wenn du schreibts:

    STRUCT_2 * struct2;
    //       ^
    

    was glaubst du hast du dann getan. Warum hast du den Stern dahin getippt?
    Um was für einen Typen handelt es sich hier?



  • ja gut das hat mir geholfen.



  • Nein, das hat dir nicht geholfen. Das hat dir einfach nur die Lösung vorgegeben die du jetzt kopieren wirst.



  • ScottZhang schrieb:

    Nein, das hat dir nicht geholfen. Das hat dir einfach nur die Lösung vorgegeben die du jetzt kopieren wirst.

    Leider 😞
    Der Code soll eigentlich auch nur zeigen, dass unsere Antworten richtig sind.


Anmelden zum Antworten