Pointer auf struct



  • Hallo,
    ich habe eine Frage, ich verusche einen Pointer auf einen Struct anzulegen, welche selbst Pointer enthält. Dann versuche ich diese zu Belegen. Hier mein Code dazu.

    [code="c"]
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    struct myStruct{
    int* counts;
    char* names;
    }*struct1;

    int main(int argc,char **args){
    struct1->counts = malloc(sizeof(int)*10);
    struct1->names = malloc(sizeof(char)*100);

    for(int i = 0; i < 10 ; i++){
    strncpy(((*struct1).names)+(i*sizeof(char)*10),"Hallo\n",(sizeof(char)*10));
    *(struct1->counts + sizeof(int)) = i;
    }

    printf("Ihre Namen %s\n",struct1->names);
    printf("Ihre counts %d\n",*(struct1->counts));
    }
    [code="c"]

    Leider bekomme ich immer ein Segmentation fault....
    Kann mir wer helfen meinen Fehler zu finden?
    Vielen Dank,
    Tobi



  • struct1 zeigt ins Nirvana.



  • Erstens: ist der Code-Tag-Button irgendwie kaputt?

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    struct myStruct{
    int* counts;
    char* names;
    }*struct1;
    
    int main(void)
    {
        struct1->counts=malloc(sizeof(int)*10);
        struct1->names =malloc(sizeof(char)*100);
    
        for(int i = 0; i < 10 ; i++)
        {
            strncpy(((*struct1).names)+(i*sizeof(char)*10),"Hallo\n",(sizeof(char)*10));
            *(struct1->counts + sizeof(int)) = i;
        }
    
        printf("Ihre Namen %s\n",struct1->names);
        printf("Ihre counts %d\n",*(struct1->counts));
    }
    

    Nö, funzt.

    Zweitens: worauf zeigt denn struct1 ? Das ist nur ein Zeiger, ein Zeiger braucht aber eine Adresse auf ein Objekt. So zeigt die Variable nur ins Nirvana.

    Drittens machst du die Indizierung besser so:

    struct1->names[i*10]
    struct1->counts[i]
    

    Viertens: Machst du besser Konstanten:

    #define SIZE_PER_SUBSTRING (10)
    #define NUMBER_OF_ELEMENTS (10)
    
    struct1->counts=malloc(sizeof(int) *NUMBER_OF_ELEMENTS);
    struct1->names =malloc(sizeof(char)*NUMBER_OF_ELEMENTS*SIZE_PER_SUBSTRING);
    for(int i = 0; i < 10 ; i++)
    {
        strncpy(&struct1->names[i*SIZE_PER_SUBSTRING],"Hallo\n",sizeof(char)*SIZE_PER_SUBSTRING);
        /*Was zur Hölle soll das sein?*/
        /**(struct1->counts + sizeof(int)) = i;*/
        struct1->counts[i]=i;
    }
    

    Und der letzte:

    printf("Ihre Namen %s\n",struct1->names);
    printf("Ihre counts %d\n",*(struct1->counts));
    

    Die erste Zeile wird dir nur einmal "Hallo" ausgeben. Weil danach ein 0-Byte kommt.
    Die zweite Zeile wird dir nur 0 ausgeben.



  • Du definierst nirgendwo einen Speicherbereich, der die struct(Elemente) aufnehmen kann.
    struct1 ist ein Zeiger (der mit NULL initialisiert ist(implizit)) und dann bei
    struct1-> dereferenziert wird, was scheitern muss.
    Ich empfehle dir erstmal, mit Arrays (d.h. zur Compilezeit feststehenden Größen) zu arbeiten, Zeiger kannst du dann immer noch üben.
    also z.B.

    typedef struct {
    int count;
    char name[100];
    } Liste;
    
    int main(){
      Liste liste[10]; /* struct-Array mit 10 Elementen definieren */
      int i;
      for(i=0;i<10;++i) /* mit Testwerten belegen */
      {
        liste[i].count=i+1;
        sprintf(liste[i].name,"%d",i);
      }
    
      for(i=0;i<10;++i) /* Ausgabe */
        printf("\n%d. %s",liste[i].count,liste[i].name);
    
      return 0;
    }
    


  • Vielen Dank für die schnellen Antworten!!

    Wutz, das ist eine Aufgabe und leider sollen wir die Größe nicht von Anfang an festgelegt haben.(Das hier war nur ein kurzer Testcode)

    Kann ich meinen Pointer struct1 einfach mit malloc initialisieren?
    Also so: struct1 = malloc(sizeof(myStruct))?



  • TorbenVerdorben schrieb:

    Kann ich meinen Pointer struct1 einfach mit malloc initialisieren?
    Also so: struct1 = malloc(sizeof(myStruct))?

    Klar.

    Aber für eine (nicht sehr große) Variable lohnt sich das irgendwie nicht.



  • DirkB schrieb:

    Aber für eine (nicht sehr große) Variable lohnt sich das irgendwie nicht.

    Aufgabe ist Aufgabe, aber im Prinzip hast du natürlich Recht.


Anmelden zum Antworten