Uebung - moegliche Erweiterung von Klasse SerialEvent - dynamische Arraygroesse

Dependencies:   mbed

Committer:
Powers
Date:
Thu Jan 31 23:05:44 2019 +0000
Revision:
0:cd7dcdb46501
Uebung - Moegliche Erweiterung fuer Klasse SerialEvent - MALLOC -ARRAY

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Powers 0:cd7dcdb46501 1 #include "mbed.h"
Powers 0:cd7dcdb46501 2
Powers 0:cd7dcdb46501 3 // Uebung zur möglichen Erweiterung der Klasse SerialEvent
Powers 0:cd7dcdb46501 4 // um die Arraygrößen für die Strings dynamisch zu bestimmen
Powers 0:cd7dcdb46501 5
Powers 0:cd7dcdb46501 6
Powers 0:cd7dcdb46501 7 void dynamic_array(int arreaylaenge);
Powers 0:cd7dcdb46501 8
Powers 0:cd7dcdb46501 9 int main()
Powers 0:cd7dcdb46501 10 {
Powers 0:cd7dcdb46501 11
Powers 0:cd7dcdb46501 12 dynamic_array(99);
Powers 0:cd7dcdb46501 13
Powers 0:cd7dcdb46501 14 return 0;
Powers 0:cd7dcdb46501 15 }
Powers 0:cd7dcdb46501 16
Powers 0:cd7dcdb46501 17
Powers 0:cd7dcdb46501 18 void dynamic_array(int arraylaenge)
Powers 0:cd7dcdb46501 19 {
Powers 0:cd7dcdb46501 20 //Ueberpruefung wieviel speicher ein Char braucht um die groeße des zu reservierenden Speichers
Powers 0:cd7dcdb46501 21 //mit der in C integrierten Funktion "sizeof()" kann die Groesse in Bytes von Datentypen und Daten
Powers 0:cd7dcdb46501 22 //ermittelt werden
Powers 0:cd7dcdb46501 23 printf("Size of a \"char\": %i Byte \n\n", sizeof(char));
Powers 0:cd7dcdb46501 24
Powers 0:cd7dcdb46501 25 //malloc gibt einen pointer zurueck der auf den reservierten Speicherbereich zeigt
Powers 0:cd7dcdb46501 26 //wichtig beim erstellen des char arrays immer lange + 1 fuer das 0-Byte
Powers 0:cd7dcdb46501 27
Powers 0:cd7dcdb46501 28 //einen char Pointer erstellen der dann auf das Array im Speicher zeigen soll
Powers 0:cd7dcdb46501 29 //wird an die malloc Funktion gebunden, da diese einen Pointer zurueck gibt
Powers 0:cd7dcdb46501 30 char *str_pointer;
Powers 0:cd7dcdb46501 31 printf("Adresse vom str_pointer Pointer: %i - 0x%x \n", &str_pointer, &str_pointer);
Powers 0:cd7dcdb46501 32 //Laenge ist die uebergebene arreylaenge + 1 char fuer das 0 Byte '\0'
Powers 0:cd7dcdb46501 33 str_pointer = (char*)malloc(arraylaenge * sizeof(char) + sizeof(char));
Powers 0:cd7dcdb46501 34 printf("Adresse vom neuen str_pointer Array: %i - 0x%x \n\n", str_pointer, str_pointer);
Powers 0:cd7dcdb46501 35 printf("Groesse des Datensatzes -> %i Byte \n\n", arraylaenge+1);
Powers 0:cd7dcdb46501 36 //str_pointer = (char*)malloc(8+1); // auch moeglich aber besser wie oben da auf einem anderen
Powers 0:cd7dcdb46501 37 // Betriebssystem der Speicher für Char koennte anders sein kann
Powers 0:cd7dcdb46501 38
Powers 0:cd7dcdb46501 39 // Im Speicher werden 9Byte vom Typ char reserviert
Powers 0:cd7dcdb46501 40 // 0 Byte muss selbst gesetzt werden '\0'
Powers 0:cd7dcdb46501 41 // 1 char Element brauch 1 Byte her werden 8 Byte fuer die Daten
Powers 0:cd7dcdb46501 42 // und 1 Byte für das speichern des 0 Bytes
Powers 0:cd7dcdb46501 43
Powers 0:cd7dcdb46501 44 str_pointer[0] = '0'; // wenn man etwas in einen Bereich schreibt der nicht reserviert
Powers 0:cd7dcdb46501 45 // ist zB str_pointer[9] stürzt das Programm ab, da man
Powers 0:cd7dcdb46501 46 // in einen Bereich des Speichers schreibt der auserhalb
Powers 0:cd7dcdb46501 47 // des Arrays ist [Zugriff auf Fremddaten meglich :) :) ]
Powers 0:cd7dcdb46501 48
Powers 0:cd7dcdb46501 49 for (int x = 0; x < arraylaenge; x++)
Powers 0:cd7dcdb46501 50 {
Powers 0:cd7dcdb46501 51 str_pointer[x] = 'e'; // Fuellen des Arrays mit e's
Powers 0:cd7dcdb46501 52 }
Powers 0:cd7dcdb46501 53 str_pointer[arraylaenge] = '\0'; // 0-Byte setzen zum beenden des Strings - notwendig da Array
Powers 0:cd7dcdb46501 54 printf("Inhalt des Arrays nach dem Befuellen --> \n%s \n\n", str_pointer);
Powers 0:cd7dcdb46501 55
Powers 0:cd7dcdb46501 56 // Testabfrage eines Feldes -> valid
Powers 0:cd7dcdb46501 57 printf("Ausgabe vor dem Freigeben des Speichers - str_pointer[3]: %c \n", str_pointer[3]);
Powers 0:cd7dcdb46501 58
Powers 0:cd7dcdb46501 59 // Speicher wieder freigeben - muss gemacht werden sonst -> Memory Leak
Powers 0:cd7dcdb46501 60 free(str_pointer);
Powers 0:cd7dcdb46501 61
Powers 0:cd7dcdb46501 62 // Testabfrage eines Feldes -> invalid - da der speicher freigegeben wurde und man in einen Bereich kommt
Powers 0:cd7dcdb46501 63 // der nicht mehr vom Programm benutzt wird
Powers 0:cd7dcdb46501 64 printf("Ausgabe nach dem Freigeben des Speichers - str_pointer[3]: %c \n", str_pointer[3]);
Powers 0:cd7dcdb46501 65
Powers 0:cd7dcdb46501 66 }