Jeśli dostaniesz tablicę znaków, która może zawierać lub nie ma danych zakończonych znakiem NUL, naprawdę nie jest dobrym sposobem sprawdzenia. Najlepsze, co możesz zrobić, to szukać znaku pustego aż do określonej wartości cedera (nie w nieskończoność!). Ale 0 nie jest dokładnie niezwykłym bajtem danych, które można znaleźć w niezainicjowanym obszarze pamięci.
Jest to jedna z wielu cech standardu C defacto, którego nie lubi wiele osób. Odnalezienie długości ciągu, który klient podaje użytkownikowi, to operacja wyszukiwania O (n) w najlepszym wypadku, aw najgorszym przypadku błąd segmentacji.
Inną kwestią jest oczywiście, że tablice i wskaźniki są wymienialne.Oznacza to, że array_name + 2
jest taki sam jak &(array_name[2])
i sizeof(a)
jest sizeof(char*)
, a nie długość tablicy.
'strnlen' dla bezpieczeństwa. – nmichaels
'Strnlen' jest specyficzny dla platformy, a nie w standardzie. – jer
@Nathon: 'strnlen' tak naprawdę nie zwiększa bezpieczeństwa, prawda? Jeśli twoja funkcja wymaga łańcucha zakończonego wartością NULL i nie dostaje jednego (lub jeśli funkcja jest określona jako zwracająca łańcuch zakończony znakiem NUL i nie zwraca żadnej), twój kod jest już uszkodzony. –