L E H R S T U H L F Ü R R E A L Z E I T - C O M P U T E R S Y S T E M E T E C H N I S C H E U N I V E R S I T Ä T M Ü N C H E N U N I V. - P R O F. D R. - I N G. G. F Ä R B E R Test zum C-Grundwissen (nicht C++) C-Schlüsselworte 1) Welche Bedeutung haben die Schlüsselwörter const, extern und static? 2) Wie unterscheidet sich diese abhängig vom Kontext? 3) Welche Bedeutung hat das Schlüsselwort volatile? Variablen 4) An welchen Stellen im Quelltext dürfen Variablen definiert werden? 5) Wie unterscheiden sich structs von unions? 6) Wie kann man auf eine bestimmte Adresse im Speicher zugreifen? 7) Was ist der Unterschied zwischen Variablen vom Typ char * und int *? 8) Was ist die Bedeutung von folgenden 2 Zeilen Code (i ist vom Typ int *)? *i = 0; i = 0; 9) Was wurde hier nicht beachtet? int char_value = 0; void char_value(char c) { char_value = (int)c - 0x30; } 10) Was sind die Unterschiede folgender Definitionen? const char *str0 = "Hello"; char str1[] = "Hello"; char *const str2 = str1; 1 Dipl.–Ing. Thomas Maier-Komor, 24. April 2007 Fragen zum fortgeschrittenen Wissen sind kursiv gedruckt Fragen zum erforderlichen Grundwissen sind fett gedruckt 1 Flusskontrolle 11) Was für verschiedene Möglichkeiten gibt es eine Schleife zu realisieren (4 Varianten)? 12) Welche davon sollte man nicht benutzen? 13) Wie kann eine Schleife vorzeitig abgebrochen werden? 14) Wie kann ein neuer Schleifendurchlauf vorzeitig erzwungen werden? 15) Was für ein Fehler wurde hier gemacht? int transform(char c) { int i; switch(c) { case ’0’: i = 0; case ’1’: i = 1; case ’2’: i = 2; } return i; } 16) Für welche Werte von i wird a bzw. b aufgerufen? void xyz(int i) { if (i) a(); else b(); } 17) Warum gibt folgende Funktion immer 0 zurück? int checkValue(int i) { if (i = 3) return 0; else return 1; } L E H R S T U H L F Ü R R E A L Z E I T - C O M P U T E R S Y S T E M E T E C H N I S C H E U N I V E R S I T Ä T M Ü N C H E N U N I V. - P R O F. D R. - I N G. G. F Ä R B E R Operatoren 26) Was für Funktionen gibt es in der C-Bibliothek für die Stringverarbeitung? 18) Was ist der Unterschied zwischen && und &? 19) Wie kann einfach überprüft werden ob ein Bit gesetzt ist? 27) Worauf ist bei der Bearbeitung von Strings zu achten? 20) Wie setzt/löscht/wechselt man ein Bit? 28) Was führt hier möglicherweise zum Absturz? 21) Wie extrahiert man das obere Byte eines 16-bit Wortes? #include <stdio.h> int main(int argc, char **argv) { char *p = "hello, world!"; p[0] = ’H’; printf("%s: %s\n",argv[0],p); return 0; } Speichermanagement 22) Welche Funktionen gibt es für die dynamische Speicherverwaltung und was ist bei ihrer Benutzung zu beachten? 23) Gestalten Sie nachfolgenden Code robust! struct ST { int value; struct ST *next; }; int successorsValue(struct ST *st) { return st->next->value; } 29) Wie müßte man es richtig machen? I/O 30) Was versteht man unter I/O-Routinen? 31) Welche grundlegenden I/O-Routinen gibt es in der C-Bibliothek (min. 4)? 32) Warum liefert der nachfolgende Code höchst wahrscheinlich falsche Daten oder stürzt ab? 24) Warum ist folgende Definition sinnlos? void square(int x) { x *= x; } Strings 25) Korrigieren Sie folgendes Programm! #include <stdio.h> int main(void) { char *name; printf("What’s your name?\n"); gets(name); printf("hello %s\n",name); return 0; } #include <unistd.h> char * readData(int fd) { char buf[256]; read(fd,buf,256); return buf; } Präprozessor 33) Wann empfiehlt sich der Einsatz von Präprozessor-Makros? 34) Worin besteht der Unterschied zwischen folgenden Präprozessorkommandos? #include "xyz.h" #include <xyz.h>