Pointer auf zweidimensionales char-Array



  • 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