Das Buch für Anfänger zur C Programmierung unter Linux und MS Windows, Einstieg in C Jürgen Wolf C C++ C/C++ Programmieren Linux ANSI C Standard C C99 Einstieg in C Buch Bücher Einstieg in C - C Kurs Programmieren C/C++ Tutorial Lösungen zu den Aufgaben von Kapitel 17 bis 18
  1. Hier eine möglich Lösung:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define MAX 25
    #define DAT 5
    #define BEM 4096
    
    struct daten{
            char vorname[MAX];
            char nachname[MAX];
            char *bemerkung;
            };
    
    
    void eingabe(struct daten *s)
    {
       char vn[MAX], nn[MAX], anmerkung[BEM];
    
       printf("Vorname   : ");
       fgets(vn, MAX, stdin);
       printf("Nachname   : ");
       fgets(nn, MAX, stdin);
       printf("Bemerkung : ");
       fgets(anmerkung, BEM, stdin);
    
       strcpy(s->vorname, vn);
       strcpy(s->nachname, nn);
    
       s->bemerkung = (char *)malloc(strlen(anmerkung)+1);
       if(s->bemerkung == NULL)
       {
               printf("Speichermangel...!!!\n");
               exit(0);
       }
       strcpy(s->bemerkung, anmerkung);
    }
    
    
    void ausgabe(struct daten *s)
    {
        printf("Vorname  : %s",s->vorname);
        printf("Nachname : %s",s->nachname);
        printf("Bemerkung: %s",s->bemerkung);
    }
    
    
    
    int main()
    {
     struct daten satz[DAT];
     int i;
    
     for(i=0; i<DAT; i++)
             eingabe(&satz[i]);
    
     for(i=0; i<DAT; i++)
         ausgabe(&satz[i]);
    
     return 0;
    }
  2. Das Beispiel dazu:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define MAX 25
    #define BEM 4096
    
    struct daten{
            char vorname[MAX];
            char nachname[MAX];
            char *bemerkung;
            };
    
    
    void eingabe(struct daten *s)
    {
       char vn[MAX], nn[MAX], anmerkung[BEM];
    
       printf("Vorname   : ");
       fgets(vn, MAX, stdin);
       printf("Nachname   : ");
       fgets(nn, MAX, stdin);
       printf("Bemerkung : ");
       fgets(anmerkung, BEM, stdin);
    
       strcpy(s->vorname, vn);
       strcpy(s->nachname, nn);
    
       s->bemerkung = (char *)malloc(strlen(anmerkung)+1);
       if(s->bemerkung == NULL)
       {
               printf("Speichermangel...!!!\n");
               exit(0);
       }
       strcpy(s->bemerkung, anmerkung);
    }
    
    
    void ausgabe(struct daten *s)
    {
        printf("Vorname  : %s",s->vorname);
        printf("Nachname : %s",s->nachname);
        printf("Bemerkung: %s",s->bemerkung);
    }
    
    
    int main()
    {
     struct daten *satz;
     unsigned int i;
     size_t len;
    
     printf("Wieviele Datensätze benötigen Sie : ");
     scanf("%d",&len);
     getchar();
     printf("...reserviere Speicher...\n");
    
     satz = (struct daten *)calloc(len, sizeof(struct daten *));
     if(satz == NULL)
     {
             printf("Speicherplatzmangel ...\n");
             exit(0);
     }
    
     for(i=0; i<len; i++)
             eingabe(&satz[i]);
    
     for(i=0; i<len; i++)
         ausgabe(&satz[i]);
    
     return 0;
    }
  3. Rein syntaktisch sind union gleichwertig mit struct (abgesehen von der Initialisierung). Der Unterschied ist, dass eine Strukturvariable vom Typ union immer nur eines deren angegebenen Elemente enthalten kann. Sie sollten aber die Übersicht behalten, auf welches Element Sie das letzte mal zugegriffen haben.

  4. Um optimal auf die Daten im Speicher zugreifen zu können, werden diese in einem zwei-Byte-Allignment oder in einem vier-Byte-Alignment angeordnet. Bei einer Struktur, die bspw. in Wirklichkeit nur 14 Bytes an Speicher benötigt, belegt durch ein vier-Byte-Alignment 16 Bytes an Speicher. Die nicht belegten Bytes werden einfach aufgefüllt (Padding).