Uebung - moegliche Erweiterung von Klasse SerialEvent - dynamische Arraygroesse
Dependencies: mbed
main.cpp@0:cd7dcdb46501, 2019-01-31 (annotated)
- 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?
User | Revision | Line number | New 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 | } |