#include <www.pronix.de>

Home

 Programmieren
C-Programmieren
Perl
CGI

 Bücher
C von A bis Z
+ Compiler
+ Listings
+ Aufgaben
+ Links
+ Updates
C M&T easy
Rezensionen

 Service
Links
Feedback
Mailingliste
Newsletter

 Sonstiges
FAQ
Impressum
 

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, ...).








 

 

© 2000 - 2003 Jürgen Wolf