ESP Tutorium Studienassistent: Ewald Moitzi Gruppe 1
Finde den Fehler 1 char text[5]; strcpy (text, "hallo"); printf ("%s\n",text); char text[5]; strcpy (text, "hallo"); printf ("%s\n",text); ? Ausgabe:
Finde den Fehler 1 char text[5]; strcpy (text, "hallo"); printf ("%s\n",text); char text[5]; strcpy (text, "hallo"); printf ("%s\n",text); ? Ausgabe: hallo$%§$&45
Finde den Fehler 1 char text[5]; strcpy (text, "hallo"); printf ("%s\n",text); char text[5]; strcpy (text, "hallo"); printf ("%s\n",text); ? Ausgabe: hallo$%§$&45
int check_value = 1; if (check_value == 0); { printf ("in if\n"); } printf ("after if\n"); int check_value = 1; if (check_value == 0); { printf ("in if\n"); } printf ("after if\n"); ? Ausgabe: Finde den Fehler 2
int check_value = 1; if (check_value == 0); { printf ("in if\n"); } printf ("after if\n"); int check_value = 1; if (check_value == 0); { printf ("in if\n"); } printf ("after if\n"); ? Ausgabe: in if after if Finde den Fehler 2
int check_value = 1; if (check_value == 0); { printf ("in if\n"); } printf ("after if\n"); int check_value = 1; if (check_value == 0); { printf ("in if\n"); } printf ("after if\n"); ? Ausgabe: in if after if Finde den Fehler 2
void getNextEven(unsigned int number) { if ((number % 2) == 1) number++; } void getNextEven(unsigned int number) { if ((number % 2) == 1) number++; } Ausgabe: Finde den Fehler 3 int number = 3; getNextEven(number); printf ("%d\n",number); ?
void getNextEven(unsigned int number) { if ((number % 2) == 1) number++; } void getNextEven(unsigned int number) { if ((number % 2) == 1) number++; } Ausgabe: 3 Finde den Fehler 3 int number = 3; getNextEven(number); printf ("%d\n",number); ?
void getNextEven(unsigned int number) { if ((number % 2) == 1) number++; } void getNextEven(unsigned int number) { if ((number % 2) == 1) number++; } Ausgabe: 3 Finde den Fehler 3 unsigned int number = 3; getNextEven(number); printf ("%d\n",number); ?
Finde den Fehler 4 char text[5]; strcpy (text, "hallo"); printf ("%s\n",text); char text[5]; strcpy (text, "hallo"); printf ("%s\n",text); ? Ausgabe:
Finde den Fehler 5 int array[5]; array[5] = 123; printf ("%d\n",array[5]); int array[5]; array[5] = 123; printf ("%d\n",array[5]); ? Ausgabe:
Finde den Fehler 5 int array[5]; array[5] = 123; printf ("%d\n",array[5]); int array[5]; array[5] = 123; printf ("%d\n",array[5]); ? Ausgabe: 123
Finde den Fehler 5 int array[5]; array[5] = 123; printf ("%d\n",array[5]); int array[5]; array[5] = 123; printf ("%d\n",array[5]); ? Ausgabe: 123
Finde den Fehler 6 float number = 1.1; if (number == 1.1) printf ("number == 1.1\n"); else printf ("number != 1.1\n"); float number = 1.1; if (number == 1.1) printf ("number == 1.1\n"); else printf ("number != 1.1\n"); ? Ausgabe:
Finde den Fehler 6 float number = 1.1; if (number == 1.1) printf ("number == 1.1\n"); else printf ("number != 1.1\n"); float number = 1.1; if (number == 1.1) printf ("number == 1.1\n"); else printf ("number != 1.1\n"); ? Ausgabe: number != 1.1
Finde den Fehler 6 float number = 1.1; if (number == 1.1) printf ("number == 1.1\n"); else printf ("number != 1.1\n"); float number = 1.1; if (number == 1.1) printf ("number == 1.1\n"); else printf ("number != 1.1\n"); ? Ausgabe: number != 1.1
Zahlenrepräsentation Zahlensysteme Binär (Basis 2) Octal (Basis 8) (in C z.B. 0123) Dezimal (Basis 10) (in C z.B. 123) Hexadezimal (Basis 16) (in C z.B. 0x123) Hexadezimal 0 – 9 +
Zahlenrepräsentation : Dezimal → Hex Durch Zielbasis dividieren, Rest von rechts nach links anschreiben
Zahlenrepräsentation 0xBEEF : Hex → Dezimal Von rechts nach links: Wert x 16 mit Stelle potenzieren
Dynamischer Speicher #include void *malloc (size_t size); void free (void *base_ptr); void *realloc(void *base_ptr, size_t size);
Dynamischer Speicher - Hinweise Neuer Speicherblock ist uninitialisiert Freigeben nicht vergessen Pointer auf freigegebenen Speicher (Speichermüll!) Nach..alloc() immer auf NULL überprüfen (Speicher voll?) realloc(): tmp pointer verwenden! realloc(): vorsicht in funktionen VALGRIND VERWENDEN!!
Valgrind Bei gcc mit –g kompilieren Aufruf Valgrind Tutorial > valgrind --tool=memcheck --leak-check=yes./name
Mehrdimensionale Arrays Auch mehrdimensionale Arrays liegen sequentiell im Speicher: n.d. 0x2740 0x2744 0x2748 0x274B 0x274F 0x2743 int array[2][2]; array befindet sich an der Speicherstelle 0x2740 Zugriff auf 2. Element der 2. Dimension: array[1][1] oder: *(*(array + 1) + 1) Beide Notationen liefern den Wert an der Stelle 0x274B n.d. array[0][0] array[0][1] array[1][0] array[1][1] array
Finde den Fehler 7 int *pointer; pointer = malloc (10 * sizeof (int)); *pointer = 1; printf ("%d\n", *pointer); int *pointer; pointer = malloc (10 * sizeof (int)); *pointer = 1; printf ("%d\n", *pointer); ? Ausgabe:
Finde den Fehler 7 int *pointer; pointer = malloc (10 * sizeof (int)); *pointer = 1; printf ("%d\n", *pointer); int *pointer; pointer = malloc (10 * sizeof (int)); *pointer = 1; printf ("%d\n", *pointer); ? Ausgabe: Segmentation fault (möglicherweise)
Finde den Fehler 7 int *pointer; pointer = malloc (10 * sizeof (int)); *pointer = 1; printf ("%d\n", *pointer); int *pointer; pointer = malloc (10 * sizeof (int)); *pointer = 1; printf ("%d\n", *pointer); ? Ausgabe: Segmentation fault (möglicherweise)
Finde den Fehler 8 int *pointer; pointer = malloc (10); pointer[9] = 1; printf ("%d\n", pointer[9]); int *pointer; pointer = malloc (10); pointer[9] = 1; printf ("%d\n", pointer[9]); ? Ausgabe:
Finde den Fehler 8 int *pointer; pointer = malloc (10); pointer[9] = 1; printf ("%d\n", pointer[9]); int *pointer; pointer = malloc (10); pointer[9] = 1; printf ("%d\n", pointer[9]); ? Ausgabe: 1
Finde den Fehler 8 int *pointer; pointer = malloc (10); pointer[9] = 1; printf ("%d\n", pointer[9]); int *pointer; pointer = malloc (10); pointer[9] = 1; printf ("%d\n", pointer[9]); ? Ausgabe: 1
Finde den Fehler 9 char *buffer = malloc (16); buffer = realloc (buffer,32); if (buffer == NULL) { free (buffer); } char *buffer = malloc (16); buffer = realloc (buffer,32); if (buffer == NULL) { free (buffer); } ? Ergebnis:
Finde den Fehler 9 char *buffer = malloc (16); buffer = realloc (buffer,32); if (buffer == NULL) { free (buffer); } char *buffer = malloc (16); buffer = realloc (buffer,32); if (buffer == NULL) { free (buffer); } ? Ergebnis: Möglicherweise Speicherloch
Finde den Fehler 9 char *buffer = malloc (16); buffer = realloc (buffer,32); if (buffer == NULL) { free (buffer); } char *buffer = malloc (16); buffer = realloc (buffer,32); if (buffer == NULL) { free (buffer); } ? Ergebnis: Möglicherweise Speicherloch
Finde den Fehler 10 char *argv[2] = {"a.out", "Some" "text"}; int length = strlen(argv[1]); char text[length]; int i; for (i = 0; i < length; i++) text[i] = argv[1][i]; printf("%s\n", text); char *argv[2] = {"a.out", "Some" "text"}; int length = strlen(argv[1]); char text[length]; int i; for (i = 0; i < length; i++) text[i] = argv[1][i]; printf("%s\n", text); ? Ausgabe:
Finde den Fehler 10 char *argv[2] = {"a.out", "Some" "text"}; int length = strlen(argv[1]); char text[length]; int i; for (i = 0; i < length; i++) text[i] = argv[1][i]; printf("%s\n", text); char *argv[2] = {"a.out", "Some" "text"}; int length = strlen(argv[1]); char text[length]; int i; for (i = 0; i < length; i++) text[i] = argv[1][i]; printf("%s\n", text); ? Ausgabe: Some text$&/?=
Finde den Fehler 10 char *argv[2] = {"a.out", "Some" "text"}; int length = strlen(argv[1]); char text[length]; int i; for (i = 0; i < length; i++) text[i] = argv[1][i]; printf("%s\n", text); char *argv[2] = {"a.out", "Some" "text"}; int length = strlen(argv[1]); char text[length]; int i; for (i = 0; i < length; i++) text[i] = argv[1][i]; printf("%s\n", text); ? Ausgabe: Some text$&/?=