speicher malloc?



  • Hallo, ich hab mich im C++ forum vertan undsoll die Frgae hier noch aml posten:

    mein Problem:

    typedef struct na2
    {
      char*  name;
      int    anz;
    } na2element
    
    im main:
    
    na2element einname[1024];
    
    initialisierung:
    
      for (i = 0; i < 1024; i++)
      {
        einname[i].name = NULL;
        einname[i].anz = 0;
      }
    
    in einer while schleife gebe ich datein in das struct:
    
      while (bedingung)
      {
        // daten werden umständlicher gefüllt, deshalb hier nur ein Beispiel. aber auch dieses funktioniert nicht
    
        einname[i].name = "test";
        einname[i].anz++;
    i++
    
    // wenn ich hier ein cout mache, bekomm ich ein Ergebniss:
        printf("%5i  %s\n",anz, name);
      }
    
    // wenn ich hier ein cout mache, bekomm ich KEIN Ergebniss:
    
    for(i=0;i<=1024;i++){
        printf("%5i  %s\n",einname[i].anz, einname[i].name);
    }
    

    ANTWORT:

    In dieser Zeile: einname[i].name = "test";
    weist du dem Pointer einen Verweis auf einen temporären String zu. Wenn du den Gültigkeitsbereich verläßt, ist das Verhalten undefiniert bzw. Glück etc. Also entweder für name Speicher reservieren (zB mit new) oder gleich std::string benutzen.

    FRAGE:
    jetzt weiss ich nicht, wie ich den speicher zuweisen soll?

    so funktioniert es leider nicht 😞

    na2element einname[1024]= (na2element) malloc(1024*(sizeof(na2element)));
    


  • Wie währs mit

    na2element einnahmen[1024];
    int i = 0;
    
    for( i = 0; 1024 > i; i++ )
      strcpy( einnahmen[i].name, "test" );
    

    oder du machst halt

    na2element *einnahmen;
    
    einnahmen = malloc( 1024 * sizeof( na2element ) );
    
    strcpy( einnahmen.name, "hey" );
    


  • Es gibt mehrere Möglichkeiten -- ok, bei so ziemlich allem gibt es nicht
    die Lösung -- hier mal ein Vorschlag von mir:

    1. wenn du weißt, dass deine Namen eine gewisse Größe nicht überschreiten,
      kannst du ausreichend viel Speicher schon im struct definieren:
    typedef struct na2
    {
      char   name[1024];  // <-- hier legst du nun Speicher für den Namen an!
      int    anz;
    } na2element
    

    @lippoliv: das hattest du in deinem Beispiel vergessen gehabt.

    Die Verwendung ist dann ähnlich wie bei lippoliv:

    strncpy( einnahmen[i].name, "test", 1024 );
    

    2. Wenn du nun keine obere Grenze für die Länge der Namen kennst, oder
    du Speicher sparen mußt, kannst du mit malloc ausreichend viel Speicher
    anlegen.

    einnahmen[i].name = malloc((strlen("test")+1) * sizeof(char));
        strncpy(einnahmen[i].name, "test", strlen("test"));
    

    Hierbei kannst du den struct so belassen, wie du ihn ursprünglich hattest.

    @lippoliv: ich glaube, dass beide deiner Vorschläge nicht funktioneren, da
    du nur Speicher für die Struktur na2element anlegst, aber nicht für den
    innerhalb der Struktur definierten String char* name.

    Gruß mcr



  • for(i=0;i<=1024;i++){

    muss

    for(i=0;i<1024;i++){

    heißen



  • Ich hatte übersehen dass er einen char Pointer benutzt...
    Ich habe jetzt lediglich auf die Struktur geachtet...
    Natürlich muss man dann noch den char Speicher reservieren, dass stimmt schon.



  • ich danke erst mal für eure Hilfe.
    den Sinn von speicher hab ich nun verstanden, aber ich hab mir duch das ganze hin und her mal wieder nen anderen Fehler eingebaut...

    erst mla danke 🙂


Log in to reply