strlen
zwraca liczbę znaków, które poprzedzają kończący znak null. Implementacja strlen
może wyglądać następująco:Czy strlen na łańcuchu z niezainicjowanymi wartościami nieokreślonego zachowania?
size_t strlen(const char * str)
{
const char *s;
for (s = str; *s; ++s) {}
return(s - str);
}
Ta szczególna realizacja dereferences s
, gdzie s
może zawierać wartości nieokreślony. Jest to równoznaczne z tym:
int a;
int* p = &a;
*p;
Tak na przykład, jeśli jeden z nich zrobić (co powoduje strlen
dać niewłaściwego wyjścia):
char buffer[10];
buffer[9] = '\0';
strlen(buffer);
Czy niezdefiniowane zachowanie?
@ user2864740 Czy jesteś pewien, że ciąg * musi * zawiera jakąś wartość? Czy C nie może szczęśliwie zawiesić się na czytaniu przed pisaniem? – kay