diff --git a/20210128/dynmem-1.c b/20210128/dynmem-1.c new file mode 100644 index 0000000000000000000000000000000000000000..129ae368b75355aecac8fca803af968e196bf720 --- /dev/null +++ b/20210128/dynmem-1.c @@ -0,0 +1,16 @@ +#include <stdio.h> +#include <stdlib.h> + +int main (void) +{ + char **name = malloc (3 * sizeof (char *)); + name[0] = "Anna"; + name[1] = "Berthold"; + name[2] = "Caesar"; + + for (int i = 0; i < 3; i++) + printf ("name[%d] = %s\n", i, name[i]); + + free (name); + return 0; +} diff --git a/20210128/dynmem-10.c b/20210128/dynmem-10.c new file mode 100644 index 0000000000000000000000000000000000000000..277cf78b0436195f2935d12e38d927024bfa80b7 --- /dev/null +++ b/20210128/dynmem-10.c @@ -0,0 +1,37 @@ +#include <stdio.h> +#include <stdlib.h> + +int main (void) +{ + int N = 3; + char **name = malloc (N * sizeof (char *)); + name[0] = "Anna"; + name[1] = "Berthold"; + name[2] = "Caesar"; + + for (int i = 0; i < N; i++) + printf ("name[%d] = %s\n", i, name[i]); + + N++; + char **new_name = malloc (N * sizeof (char *)); + for (int i = 0; i < N - 1; i++) + new_name[i] = name[i]; + name = new_name; + free (new_name); + name[N - 1] = "Dieter"; + + N++; + new_name = malloc (N * sizeof (char *)); + for (int i = 0; i < N - 1; i++) + new_name[i] = name[i]; + name = new_name; + free (new_name); + name[N - 1] = "Emma"; + + printf ("\n"); + for (int i = 0; i < N; i++) + printf ("name[%d] = %s\n", i, name[i]); + + free (name); + return 0; +} diff --git a/20210128/dynmem-11.c b/20210128/dynmem-11.c new file mode 100644 index 0000000000000000000000000000000000000000..6ec1aeb467cef507991f32afa47d47478a8346f6 --- /dev/null +++ b/20210128/dynmem-11.c @@ -0,0 +1,37 @@ +#include <stdio.h> +#include <stdlib.h> + +int main (void) +{ + int N = 3; + char **name = malloc (N * sizeof (char *)); + name[0] = "Anna"; + name[1] = "Berthold"; + name[2] = "Caesar"; + + for (int i = 0; i < N; i++) + printf ("name[%d] = %s\n", i, name[i]); + + N++; + char **new_name = malloc (N * sizeof (char *)); + for (int i = 0; i < N - 1; i++) + new_name[i] = name[i]; + free (name); + name = new_name; + name[N - 1] = "Dieter"; + + N++; + new_name = malloc (N * sizeof (char *)); + for (int i = 0; i < N - 1; i++) + new_name[i] = name[i]; + free (name); + name = new_name; + name[N - 1] = "Emma"; + + printf ("\n"); + for (int i = 0; i < N; i++) + printf ("name[%d] = %s\n", i, name[i]); + + free (name); + return 0; +} diff --git a/20210128/dynmem-12.c b/20210128/dynmem-12.c new file mode 100644 index 0000000000000000000000000000000000000000..646fab6f8a4f1266715b4307b9dc7db4b04dd75d --- /dev/null +++ b/20210128/dynmem-12.c @@ -0,0 +1,43 @@ +#include <stdio.h> +#include <stdlib.h> + +int main (void) +{ + int N = 3; + char **name = malloc (N * sizeof (char *)); + name[0] = "Anna"; + name[1] = "Berthold"; + name[2] = "Caesar"; + + for (int i = 0; i < N; i++) + printf ("name[%d] = %s\n", i, name[i]); + + N++; + char **new_name = malloc (N * sizeof (char *)); + for (int i = 0; i < N - 1; i++) + { + new_name[i] = name[i]; + free (name[i]); + } + free (name); + name = new_name; + name[N - 1] = "Dieter"; + + N++; + new_name = malloc (N * sizeof (char *)); + for (int i = 0; i < N - 1; i++) + { + new_name[i] = name[i]; + free (name[i]); + } + free (name); + name = new_name; + name[N - 1] = "Emma"; + + printf ("\n"); + for (int i = 0; i < N; i++) + printf ("name[%d] = %s\n", i, name[i]); + + free (name); + return 0; +} diff --git a/20210128/dynmem-13.c b/20210128/dynmem-13.c new file mode 100644 index 0000000000000000000000000000000000000000..05edde0ad90c61c4b297ba400352df62f326f1de --- /dev/null +++ b/20210128/dynmem-13.c @@ -0,0 +1,37 @@ +#include <stdio.h> +#include <stdlib.h> + +int N = 3; +char **name = NULL; + +void insert_string (char *s) +{ + N++; + char **new_name = malloc (N * sizeof (char *)); + for (int i = 0; i < N - 1; i++) + new_name[i] = name[i]; + free (name); + name = new_name; + name[N - 1] = s; +} + +int main (void) +{ + name = malloc (N * sizeof (char *)); + name[0] = "Anna"; + name[1] = "Berthold"; + name[2] = "Caesar"; + + for (int i = 0; i < N; i++) + printf ("name[%d] = %s\n", i, name[i]); + + insert_string ("Dieter"); + insert_string ("Emma"); + + printf ("\n"); + for (int i = 0; i < N; i++) + printf ("name[%d] = %s\n", i, name[i]); + + free (name); + return 0; +} diff --git a/20210128/dynmem-14.c b/20210128/dynmem-14.c new file mode 100644 index 0000000000000000000000000000000000000000..f337059fba37de6f43964354863d04e7123284d0 --- /dev/null +++ b/20210128/dynmem-14.c @@ -0,0 +1,33 @@ +#include <stdio.h> +#include <stdlib.h> + +int N = 3; +char **name = NULL; + +void insert_string (char *s) +{ + N++; + name = realloc (name, N * sizeof (char *)); + name[N - 1] = s; +} + +int main (void) +{ + name = malloc (N * sizeof (char *)); + name[0] = "Anna"; + name[1] = "Berthold"; + name[2] = "Caesar"; + + for (int i = 0; i < N; i++) + printf ("name[%d] = %s\n", i, name[i]); + + insert_string ("Dieter"); + insert_string ("Emma"); + + printf ("\n"); + for (int i = 0; i < N; i++) + printf ("name[%d] = %s\n", i, name[i]); + + free (name); + return 0; +} diff --git a/20210128/dynmem-2.c b/20210128/dynmem-2.c new file mode 100644 index 0000000000000000000000000000000000000000..e002b3326b70b6fd2b2fb76e033c0b0b13abfb84 --- /dev/null +++ b/20210128/dynmem-2.c @@ -0,0 +1,22 @@ +#include <stdio.h> +#include <stdlib.h> + +int main (void) +{ + char **name = malloc (3 * sizeof (char *)); + name[0] = "Anna"; + name[1] = "Berthold"; + name[2] = "Caesar"; + + for (int i = 0; i < 3; i++) + printf ("name[%d] = %s\n", i, name[i]); + + name[3] = "Dieter"; + + printf ("\n"); + for (int i = 0; i < 4; i++) + printf ("name[%d] = %s\n", i, name[i]); + + free (name); + return 0; +} diff --git a/20210128/dynmem-3.c b/20210128/dynmem-3.c new file mode 100644 index 0000000000000000000000000000000000000000..ae842579f633fcee8bae8a91047360a142786635 --- /dev/null +++ b/20210128/dynmem-3.c @@ -0,0 +1,24 @@ +#include <stdio.h> +#include <stdlib.h> + +int main (void) +{ + int N = 3; + char **name = malloc (N * sizeof (char *)); + name[0] = "Anna"; + name[1] = "Berthold"; + name[2] = "Caesar"; + + for (int i = 0; i < N; i++) + printf ("name[%d] = %s\n", i, name[i]); + + N++; + name[3] = "Dieter"; + + printf ("\n"); + for (int i = 0; i < N; i++) + printf ("name[%d] = %s\n", i, name[i]); + + free (name); + return 0; +} diff --git a/20210128/dynmem-4.c b/20210128/dynmem-4.c new file mode 100644 index 0000000000000000000000000000000000000000..2aecf6de2971501e4519c78a69aefe08269968e7 --- /dev/null +++ b/20210128/dynmem-4.c @@ -0,0 +1,27 @@ +#include <stdio.h> +#include <stdlib.h> + +int main (void) +{ + int N = 3; + char **name = malloc (N * sizeof (char *)); + name[0] = "Anna"; + name[1] = "Berthold"; + name[2] = "Caesar"; + + for (int i = 0; i < N; i++) + printf ("name[%d] = %s\n", i, name[i]); + + for (int i = 0; i < 10; i++) + { + N++; + name[3] = "Dieter"; + } + + printf ("\n"); + for (int i = 0; i < N; i++) + printf ("name[%d] = %s\n", i, name[i]); + + free (name); + return 0; +} diff --git a/20210128/dynmem-5.c b/20210128/dynmem-5.c new file mode 100644 index 0000000000000000000000000000000000000000..25dfd9363aa601db04ac7209b76fcafebdc971ef --- /dev/null +++ b/20210128/dynmem-5.c @@ -0,0 +1,26 @@ +#include <stdio.h> +#include <stdlib.h> + +int main (void) +{ + int N = 3; + char **name = malloc (N * sizeof (char *)); + name[0] = "Anna"; + name[1] = "Berthold"; + name[2] = "Caesar"; + + for (int i = 0; i < N; i++) + printf ("name[%d] = %s\n", i, name[i]); + + N++; /* Falsch! */ + name[3] = "Dieter"; + N++; + name[4] = "Emma"; /* Ausgabe führt zu Absturz! */ + + printf ("\n"); + for (int i = 0; i < N; i++) + printf ("name[%d] = %s\n", i, name[i]); + + free (name); + return 0; +} diff --git a/20210128/dynmem-6.c b/20210128/dynmem-6.c new file mode 100644 index 0000000000000000000000000000000000000000..be115dbf74d7c0585b7b46be3c4b8bab9ddcc0b1 --- /dev/null +++ b/20210128/dynmem-6.c @@ -0,0 +1,27 @@ +#include <stdio.h> +#include <stdlib.h> + +void print_names (void) +{ + int N = 3; + char **name = malloc (N * sizeof (char *)); + name[0] = "Anna"; + name[1] = "Berthold"; + name[2] = "Caesar"; + + for (int i = 0; i < N; i++) + printf ("name[%d] = %s\n", i, name[i]); + + /* Speicherleck: Der Zeiger "name" verschwindet, aber die 24 Bytes, + auf die er zeigt, sind weiterhin belegt. */ +} + +int main (void) +{ + print_names (); + print_names (); + print_names (); + print_names (); + print_names (); + return 0; +} diff --git a/20210128/dynmem-7.c b/20210128/dynmem-7.c new file mode 100644 index 0000000000000000000000000000000000000000..e6f4605ce35755f425af2018b51121e97f8b323d --- /dev/null +++ b/20210128/dynmem-7.c @@ -0,0 +1,33 @@ +#include <stdio.h> +#include <stdlib.h> + +void print_names (void) +{ + int N = 3; + char **name = malloc (N * sizeof (char *)); + name[0] = "Anna"; + name[1] = "Berthold"; + name[2] = "Caesar"; + + for (int i = 0; i < N; i++) + printf ("name[%d] = %s\n", i, name[i]); + + free (name); + + /* Kein Speicherleck: Bevor der Zeiger "name" verschwindet, + geben wir die 24 Bytes, auf die er zeigt, wieder frei. */ + + /* Garbage Collection: Die Standard-Bibliothek der Programmiersprache + sorgt dafür, daß nicht mehr benötigte Speicherbereiche automatisch + wieder freigegeben werden. C macht das nicht. */ +} + +int main (void) +{ + print_names (); + print_names (); + print_names (); + print_names (); + print_names (); + return 0; +} diff --git a/20210128/dynmem-8.c b/20210128/dynmem-8.c new file mode 100644 index 0000000000000000000000000000000000000000..235b7be5f8360ff3764a6453ff2716aaa5142167 --- /dev/null +++ b/20210128/dynmem-8.c @@ -0,0 +1,35 @@ +#include <stdio.h> +#include <stdlib.h> + +int main (void) +{ + int N = 3; + char **name = malloc (N * sizeof (char *)); + name[0] = "Anna"; + name[1] = "Berthold"; + name[2] = "Caesar"; + + for (int i = 0; i < N; i++) + printf ("name[%d] = %s\n", i, name[i]); + + N++; + char **new_name = malloc (N * sizeof (char *)); + for (int i = 0; i < N - 1; i++) + new_name[i] = name[i]; + name = new_name; + name[N - 1] = "Dieter"; + + N++; + char **new_name = malloc (N * sizeof (char *)); + for (int i = 0; i < N - 1; i++) + new_name[i] = name[i]; + name = new_name; + name[N - 1] = "Emma"; + + printf ("\n"); + for (int i = 0; i < N; i++) + printf ("name[%d] = %s\n", i, name[i]); + + free (name); + return 0; +} diff --git a/20210128/dynmem-9.c b/20210128/dynmem-9.c new file mode 100644 index 0000000000000000000000000000000000000000..ff863c1e4324ae44d1528b5aff13e9a9722fe4a7 --- /dev/null +++ b/20210128/dynmem-9.c @@ -0,0 +1,35 @@ +#include <stdio.h> +#include <stdlib.h> + +int main (void) +{ + int N = 3; + char **name = malloc (N * sizeof (char *)); + name[0] = "Anna"; + name[1] = "Berthold"; + name[2] = "Caesar"; + + for (int i = 0; i < N; i++) + printf ("name[%d] = %s\n", i, name[i]); + + N++; + char **new_name = malloc (N * sizeof (char *)); + for (int i = 0; i < N - 1; i++) + new_name[i] = name[i]; + name = new_name; + name[N - 1] = "Dieter"; + + N++; + new_name = malloc (N * sizeof (char *)); + for (int i = 0; i < N - 1; i++) + new_name[i] = name[i]; + name = new_name; + name[N - 1] = "Emma"; + + printf ("\n"); + for (int i = 0; i < N; i++) + printf ("name[%d] = %s\n", i, name[i]); + + free (name); + return 0; +} diff --git a/20210128/hp-20210128.pdf b/20210128/hp-20210128.pdf index 06019da71ff58c18d777f5090b46f6a469ebf29e..fb8d32701478cbfa971c264403c555d07f5d54f9 100644 Binary files a/20210128/hp-20210128.pdf and b/20210128/hp-20210128.pdf differ diff --git a/20210128/hp-20210128.tex b/20210128/hp-20210128.tex index b5e2211a60e816e0459c7e1d5130e716f0e66cc3..87af238337904a716caf91085ab1c9a97f7afa13 100644 --- a/20210128/hp-20210128.tex +++ b/20210128/hp-20210128.tex @@ -824,7 +824,7 @@ ... - free (name) + free (name); /* Speicherplatz freigeben */ \end{lstlisting} @@ -880,8 +880,8 @@ \put(-2.75,-0.05){\tikz{\draw[thick](0,0.25)--(2.5,-0.05);% \draw[thick](-0.1,-0.05)--(2.5,0.3);}} \put(1.5,-1.1){\begin{rotate}{7}\large\bf\textarrow\ - kommt gleich -% nächste Woche +% kommt gleich + nächste Woche \end{rotate}} \end{picture} Zeiger, die im Objekt gespeichert sind\\ diff --git a/20210128/strings-1.c b/20210128/strings-1.c new file mode 100644 index 0000000000000000000000000000000000000000..a3d7c16599ce22bcdccce64b5c3abbe0cffbe08e --- /dev/null +++ b/20210128/strings-1.c @@ -0,0 +1,9 @@ +#include <stdio.h> + +int main (void) +{ + char *hello = "Hello"; + hello[1] = 'a'; + printf ("%s\n", hello); + return 0; +} diff --git a/20210128/strings-2.c b/20210128/strings-2.c new file mode 100644 index 0000000000000000000000000000000000000000..9e0ede926f7ff007f5d3f900af45e59328825302 --- /dev/null +++ b/20210128/strings-2.c @@ -0,0 +1,9 @@ +#include <stdio.h> + +int main (void) +{ + char hello[] = "Hello"; + hello[1] = 'a'; + printf ("%s\n", hello); + return 0; +}