Przechodzę przez książkę K & R i odpowiedź na jedno z ćwiczeń mnie niepokoi.Przepełnienie tablicy bloków znaków, dobra praktyka?
W podręczniku rozwiązań, ćwiczenia 1-22 deklaruje tablicę char:
#define MAXCOL 10
char line[MAXCOL];
więc moje zrozumienie, że w C tablice przejść od 0 ... n-1. W takim przypadku powyższa deklaracja powinna przydzielić pamięć dla tablicy znaków o długości 10 zaczynającej się od 0 i kończącej się na 9. Więcej do linii punktowej [10] jest poza granicami według mojego zrozumienia? Funkcja w programie próbki jest następnie przekazywany do wartości całkowitą POS jest równe 10, a następujące porównanie odbywa:
int findblnk(int pos) {
while(pos > 0 && line[pos] != ' ')
--pos;
if (pos == 0) //no blanks in line ?
return MAXCOL;
else //at least one blank
return pos+1; //position after blank
}
Jeśli pos jest 10 i przewód [] jedynie o długości 10, wówczas nie jest linia [pos] poza granicami tablicy?
Czy można porównywać w ten sposób w C, czy może to potencjalnie prowadzić do błędu segmentacji? Jestem pewien, że podręcznik do rozwiązywania problemów jest słuszny, tylko mnie to zdezorientowało. Również w razie potrzeby mogę opublikować cały program. Dzięki!
Dzięki za szybkie i bardzo pomocne odpowiedzi, myślę, że jest to z pewnością błąd. Nazywa się przez następujący oddział:
else if (++pos >= MAXCOL) {
pos = findblnk(pos);
printl(pos);
pos = newpos(pos);
}
MAXCOL jest zdefiniowany jako 10, jak podano powyżej. Tak więc dla tego oddziału findblnk (pos) pos zostałaby zaliczona jako minimum 10.
Czy uważasz, że instrukcja rozwiązania dla K & R jest warta przejścia lub jest znana z przykładów z błędnym kodem?
Należy zauważyć, że adres 'pos [10]' ma gwarantowaną wartość OK (będzie on ważny, a jeden bajt poza 'pos [9]'). Próba dostępu do wartości w 'pos [10]', albo do odczytu lub zapisu, jest niezdefiniowanym zachowaniem. Wszystko może się zdarzyć, gdy wywołasz niezdefiniowane zachowanie, w tym "wydaje się działać" lub "awaria komputera" lub ... –