- assert !
- uwaga na sizeof (to sie liczy podczas kompilacji TYLKO)
- niebezpieczny realloc
- czemu (czasami) działa while((c=getc())!= EOF)?
Zauważmy, że typem wyniku getc() nie jest char (zapewne typ zmiennej c),
ale int! A EOF ma wartość -1.
- czemu może nie dzialac tab[c]?
przy deklaracjach
char c;
int tab[256];
instrukcja
tab[c] = 0;
może być bardzo niebezpieczna. Wszystko zależy od tego, jak będzie
interpretowany typ char: jako typ ze znakiem (signed char), czy jako typ bez znaku
(unsigned char). Interpretacja zależy od implementacji, zwykle można ją zadać
przez parametry kompilatora.
W języku C wyrażenia typu char są zawsze niejawnie konwertowane do typu int. Jeśli
char jest typem bez znaku, to tab[c] zadziała poprawnie. Jeśli jednak char jest typem
ze znakiem, to dla c > 127 wyrażenie tab[c] będzie bardzo powaznym błędem: spowoduje
wyzerowanie kilku bajtów znajdujacych się przypadkowo o c liczb całkowitych przed
(uwzględniając ujemny znak c, należałoby powiedzieć: po) początku tablicy tab!
Rozwiązanie polega na użyciu do indeksowania typu int lub unsigned char (zastosowanie
opcji kompilatora do zmiany domyślnego znaczenia char nie ma sensu, program
nie będzie przenośny, a i sami przy kolejnej kompilacji możemy zapomnieć o tej opcji.
Uwaga: przy włączeniu generowania przez kompilator wszystkich ostrzeżeń (np. -Wall
dla gcc), co koniecznie trzeba zrobić programując w C, kompilator wygeneruje
dla tej instrukcji ostrzeżenie.
- gdzie tu jest typ int: char* c = strdup(s)?
(wskazówka: nie było #include , zresztą strdup nie ma w standardzie)
- == i =
- #define MAX 30; czemu to nie jest poprawne, choć często działa?
- jak policzyć liczbę elementów inicjalizowanej tablicy czasu kompilacji (sizeof(tab)/sizeof(tab[0])
- jak ustawić kursor, wczytać znak bez echa, wczytać znak bez czekania na Enter (zależy: (n)curses, conio, ...)
- dlaczego poniższy program może się zakończyć błędem wykonania:
char s[MAX];
scanf("%s",s); /* Zakładam, że ta operacja wykona się prawidłowo, tzn. nie
nastąpi przepełnienie bufora s */
printf(s); /* Czemu ta operacja może się nie powieść, mimo że s jest prawidłowym napisem? */
(wskazówka: pierwszy parametr printf jest napisem formatującym)
Prawidłowa postać wypisywania napisu to oczywiście printf("%s",s);
- czemu poniższy fragment zapewne spowoduje błąd wykonania:
char s[10];
strcpy(s,'a');
(wskazówka: 'a' i "a" to nie to samo)
- czemu poniższy fragment jest bardzo poważnym błędem:
char *s;
strcpy(s, "Hell o!");
(wskazówka: przeczytaj opis strcpy, w szczególności znaczenie pierwszego parametru)
- czemu poniższy fragment jest poważnym błędem:
char s[3];
strcpy(s, "Ala");
(wskazówka: ile bajtów wymaga zapamiętanie napisu o długości n?)
- czemu poniższy fragment jest bardzo poważnym błędem:
int* p = malloc(sizeof(int) * 10);
if (p)
p++;
free(p);
(wskazówka: skąd free wie ile zwolnić pamięci?)
- czemu poniższy fragment jest bardzo poważnym błędem:
int* p;
p = realloc(p, 10);
(wskazówka: którego bloku pamięci będzie dotyczyła operacja realloc?)