strlen
gibt die Anzahl der Zeichen vor dem abschließenden Nullzeichen zurück. Eine Implementierung von strlen
könnte wie folgt aussehen:Strlen auf einer Zeichenfolge mit nicht initialisierten Werten undefiniertem Verhalten?
size_t strlen(const char * str)
{
const char *s;
for (s = str; *s; ++s) {}
return(s - str);
}
Diese besondere Implementierung dereferenziert s
, wo s
unbestimmte Werte enthalten. Es ist äquivalent dazu:
int a;
int* p = &a;
*p;
So zum Beispiel, wenn man dies zu tun sind (die strlen
verursacht eine falsche Ausgabe zu geben):
char buffer[10];
buffer[9] = '\0';
strlen(buffer);
Ist es nicht definiertes Verhalten?
@ user2864740 Sind Sie sicher, dass die Zeichenfolge * muss * einen Wert enthalten? Ist es nicht erlaubt, glücklich auf einem Read-Before-Write zu stürzen? – kay