Uebung - moegliche Erweiterung von Klasse SerialEvent - dynamische Arraygroesse

Dependencies:   mbed

main.cpp

Committer:
Powers
Date:
2019-01-31
Revision:
0:cd7dcdb46501

File content as of revision 0:cd7dcdb46501:

#include "mbed.h"

// Uebung zur möglichen Erweiterung der Klasse SerialEvent
// um die Arraygrößen für die Strings dynamisch zu bestimmen


void dynamic_array(int arreaylaenge);

int main()
{

    dynamic_array(99);

    return 0;
}


void dynamic_array(int arraylaenge)
{
    //Ueberpruefung wieviel speicher ein Char braucht um die groeße des zu reservierenden Speichers 
    //mit der in C integrierten Funktion "sizeof()" kann die Groesse in Bytes von Datentypen und Daten 
    //ermittelt werden
    printf("Size of a \"char\": %i Byte \n\n", sizeof(char));

    //malloc gibt einen pointer zurueck der auf den reservierten Speicherbereich zeigt
    //wichtig beim erstellen des char arrays immer lange + 1 fuer das 0-Byte

    //einen char Pointer erstellen der dann auf das Array im Speicher zeigen soll
    //wird an die malloc Funktion gebunden, da diese einen Pointer zurueck gibt
    char *str_pointer;
    printf("Adresse vom str_pointer Pointer:      %i - 0x%x \n", &str_pointer, &str_pointer);
    //Laenge ist die uebergebene arreylaenge + 1 char fuer das 0 Byte '\0'
    str_pointer = (char*)malloc(arraylaenge * sizeof(char) + sizeof(char));
    printf("Adresse vom neuen str_pointer Array:  %i - 0x%x \n\n", str_pointer, str_pointer);
    printf("Groesse des Datensatzes -> %i Byte \n\n", arraylaenge+1);
    //str_pointer = (char*)malloc(8+1);     // auch moeglich aber besser wie oben da auf einem anderen 
                                            // Betriebssystem der Speicher für Char koennte anders sein kann
    
                                            // Im Speicher werden 9Byte vom Typ char reserviert
                                            // 0 Byte muss selbst gesetzt werden '\0'
                                            // 1 char Element brauch 1 Byte her werden 8 Byte fuer die Daten
                                            // und 1 Byte für das speichern des 0 Bytes
    
    str_pointer[0] = '0';                   // wenn man etwas in einen Bereich schreibt der nicht reserviert        
                                            // ist zB str_pointer[9] stürzt das Programm ab, da man
                                            // in einen Bereich des Speichers schreibt der auserhalb
                                            // des Arrays ist [Zugriff auf Fremddaten meglich :) :) ]

    for (int x = 0; x < arraylaenge; x++)
    {
        str_pointer[x] = 'e';  // Fuellen des Arrays mit e's
    }
    str_pointer[arraylaenge] = '\0';    // 0-Byte setzen zum beenden des Strings - notwendig da Array
    printf("Inhalt des Arrays nach dem Befuellen --> \n%s \n\n", str_pointer);

    // Testabfrage eines Feldes -> valid
    printf("Ausgabe vor  dem Freigeben des Speichers - str_pointer[3]: %c \n", str_pointer[3]); 

    // Speicher wieder freigeben - muss gemacht werden sonst -> Memory Leak
    free(str_pointer);                  

    // Testabfrage eines Feldes -> invalid - da der speicher freigegeben wurde und man in einen Bereich kommt
    // der nicht mehr vom Programm benutzt wird
    printf("Ausgabe nach dem Freigeben des Speichers - str_pointer[3]: %c \n", str_pointer[3]);    
                                      
}