suche erklärung für lehrbuch-beispiel



  • hi, ich habe ein beispiel aus einem c-lehrbuch, mit dieser funktion

    void Sort(struct adres sort[], int nr)
    {
      int i,j;
      struct adres *temp;
    
      temp = (struct adres *)malloc(sizeof(struct adres *));
      if(NULL == temp)
      {
        printf("Konnte keinen Speicher reservieren...\n");
        return;
      }
      for(i = 0; i < nr; i++)
      {
        for(j=i+1;j<nr;j++)
        {
          if(strcmp(sort[i].nname, sort[j].nname) > 0)
          {
            *temp=sort[j];
            sort[j]=sort[i];
            sort[i]=*temp;
          }
        }
      }
      printf(".....Sortiert!!\n\n");
    }
    

    übergeben wird ein array von strukturen und die anzahl der elemente des arrays
    hier die struktur:

    struct adres
    {
      char vname[MAX];
      char nname[MAX];
      long PLZ;
      char ort[MAX];
      int geburtsjahr;
    } adressen[100];
    

    was ich jetzt nicht verstehe, ist die zeile

    temp = (struct adres *)malloc(sizeof(struct adres *));
    

    danach müste doch temp auf einen speicherbereich von 4 byte für einen zeiger auf eine struktur adres zeigen, aber diesen 4 byte wird eine ganze struktur zugewiesen.
    ich habe es ausprobiert, es funktioniert mit diesen beiden zeilen

    temp = (struct adres *)malloc(sizeof(struct adres *));
    
    temp = (struct adres *)malloc(sizeof(struct adres));
    

    da gibt es im ergebnis keinen unterschied.

    meine frage: warum funktioniert die erste variante auch? ich verstehe es nicht ganz und hoffe, dass mir das hier jemand erklären wird. ich programmiere schon einige zeit hobbymäßig in c++, habe aber daher nie die c-funktion malloc() benutzt und kann mir das hier nicht erklären.

    danke für jede hilfe!

    mfg,
    julian



  • kleiner_coderr schrieb:

    ich habe es ausprobiert, es funktioniert mit diesen beiden zeilen

    temp = (struct adres *)malloc(sizeof(struct adres *));
    
    temp = (struct adres *)malloc(sizeof(struct adres));
    

    da gibt es im ergebnis keinen unterschied.
    meine frage: warum funktioniert die erste variante auch?

    wahrscheinlich, weil du nur einen einzigen 'malloc' aufruf in deinem programm hast. die erste variante reserviert nur die anzahl bytes, die man für eine adresse braucht, das ist meistens viel zu wenig...
    btw: den type-cast '(struct adres *)' vor 'malloc' kannste übrigens weglassen.
    :xmas2:



  • kleiner_coderr schrieb:

    was ich jetzt nicht verstehe, ist die zeile

    temp = (struct adres *)malloc(sizeof(struct adres *));
    

    danach müste doch temp auf einen speicherbereich von 4 byte für einen zeiger auf eine struktur adres zeigen, aber diesen 4 byte wird eine ganze struktur zugewiesen.

    Richtig beobachtet, das ist ganz großer Käse in der Funktion. Bei genauerem Betrachten sieht man auch, dass dynamische Allokation in der Funktion gänzlich fehl am Platze ist, temp sollte ganz normal als struct adres auf dem Stack deklariert werden. Was ist das eigentlich für ein Buch?

    meine frage: warum funktioniert die erste variante auch?

    Weil dein Compiler nett ist oder du Glück hattest.



  • ok danke für eure antworten.
    was das fürn ein buch ist, weiß ich nicht. ich habe diese beispiel aus einem anderen forum (http://www.linux-web.de/thread.php?threadid=12820), war also gar nicht von mir die frage.

    aber trotzdem nochmal vielen dank!

    mfg,
    julian



  • sorry für den doppelpost, aber das buch heißt "C von A bis Z" von Jürgen Wolf, Galileo Computing, falls das wen interessiert.

    mfg,
    julian



  • Wundert uns bei dem Buch eher weniger 🙄



  • TactX schrieb:

    Wundert uns bei dem Buch eher weniger 🙄

    interessanterweise scheint das buch aber trotzdem einen guten ruf zu haben (wenn man mal so rezensionen etc. liest). dieser jürgen wolf hat auch vorher schon mal ein büchlein veröffentlicht ('C made easy' oder so ähnlich). das kann ja nur noch schlechter gewesen sein...



  • entweder es gibt 2 jürgen wolf, oder der typ schreibt einfch alles in ein buch was ihm grad so einfällt. mal ein computer-buch, mal ein venedig buch und das beste ist "Gruppentraining mit Kindern aus Trennungs- und Scheidungsfamilien" (bei amazon mal den namen eingeben).

    mfg,
    julian



  • ten schrieb:

    TactX schrieb:

    Wundert uns bei dem Buch eher weniger 🙄

    interessanterweise scheint das buch aber trotzdem einen guten ruf zu haben (wenn man mal so rezensionen etc. liest).

    Wundert mich auch ein wenig. Liegt aber wahrscheinlich daran, dass Anfänger das Buch gut finden (weil es ausführlich erklärt), aber gleichzeitig die Fehler einfach nicht erkennen.
    Ich überlege eh schon länger den Link aus der "Linkliste fuer Neulinge" zu streichen.



  • TactX schrieb:

    Ich überlege eh schon länger den Link aus der "Linkliste fuer Neulinge" zu streichen.

    kannst ja dazuschreiben, dass du's wegen der vielen fehler nicht empfehlen würdest (natürlich etwas vorsichtig formuliert, damit Marc++us keine klage an'n hals kriegt).



  • ten schrieb:

    TactX schrieb:

    Ich überlege eh schon länger den Link aus der "Linkliste fuer Neulinge" zu streichen.

    kannst ja dazuschreiben, dass du's wegen der vielen fehler nicht empfehlen würdest (natürlich etwas vorsichtig formuliert, damit Marc++us keine klage an'n hals kriegt).

    Klar, offiziell niedermachen sollte man das Buch nicht. Aber die Idee ist gut. Danke.


Anmelden zum Antworten