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 26
  1. Hier die verbesserte Version:

    #include <stdio.h>
    #include <string.h>
    #define MAX 10 
    
    int main()
    {
     char name[MAX];
     char copy[MAX];
    
     printf("Dein Vorname : ");
     fgets(name, MAX, stdin);   
    
     strncpy(copy, name, MAX); 
    
     printf("Orginal: %sKopie: %s\n",name, copy);
     return 0;
    }
  2. Der klassische Fehler mit der Funktion strlen(). Diese Funktion zählt alle Zeichen bis auf das Stringendezeichen ('\0'). Das Zeichen benötigt aber auch einen Byte an Speicherplatz.

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    int main()
    {
     char *string = "Hallo Welt";
     char *copy;
    
     /* String kopieren */
     copy = (char *)malloc(strlen(string)+1);
     if(copy == NULL)
        {
           printf("Speichermangel...\n");
           exit(0);
        }
     strcpy(copy, string);
    
     printf("Orginal: %s\n",string);
     printf("Kopie  : %s\n",copy);
     return 0;
    }
  3. Verändern Sie das Listing erstmal folgendermaßen:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
     int i;
     char *heap;
    
     printf("Wieviel Speicherplatz benötigen Sie: ");
     scanf("%4d",&i);
     /* Gefährlich, wenn User -1 eingibt */
     //heap = (char *)malloc(i);
     /* Beweis */
     printf("%u\n",i);
     return 0;
    }

    Geben Sie jetzt den Wert -1 ein und sehen Sie sich die printf()-Ausgabe an. Funktionen wie malloc() oder memcpy() behandeln nämlich aus Sicherheitsgründen den Wert als postiven Wert. Somit würden Sie bei einer Eingabe von -1, 4GB Speicher anfordern. Sichern Sie sich vor solche Eingaben mit einer einfachen Bedingung ab!

  4. Ein Memory Leak ist ein Speicher, der zur Laufzeit des Programms angefordert wurde aber niemals mehr an die Speicherverwaltung des Systems zurückgegeben wird. Meistens tritt ein Memory Leak durch ein vergessenes free() auf. Kritisch wird dieser Fehler bei dauerhaft im Einsatz befindlichen Programmen (Serverprogrammen, ...).