Forum: PC-Programmierung for Schleife


von funky (Gast)


Lesenswert?

Hallo,

ich habe ein kleines Verständnisproblem bei einer for Schleife.
*key ist ein Zeiger auf ein 10Stelliges Char Array
Die Funktion berechnet einen Hashwert, und funktioniert prinzipiell 
auch(ist aber nicht auf meinem Mist gewachsen)

Ich untersuche das ganze nun mit Valgrind, da das Programm manchmal bei 
eben dieser for Schleife mit einem "Invalid read of size 1" crasht.
Ich sehe da eigentlich nicht wirklich eine typische 
for-Abbruchbedingung, aber es funktioniert ja(meistens)

Generiert das *ptr++ irgendeinen Rückgabewert der die for-Schleife 
weiterlaufen/abbrechen lässt, wenn man am Ende des Arrays angekommen 
ist?
1
hash_t CDB::_db_hash(CONST char *key) {
2
    hash_t hval;
3
    char   *ptr;
4
    char   c;
5
    int     i;
6
7
    hval = 0;
8
    for (ptr = (char *)key, i = 1; c = *ptr++; i++) {
9
        hval += c * i;  // ascii char times its 1-based index
10
    }
11
    return(hval % DB_NHASH_DEF);  
12
}

Ich frage mich nun, was der Grund dafür sein kann, das es manchmal 
funktioniert und manchmal nicht.

Danke schon mal, falls mir jemand den genauen Ablauf der Schleife 
verklickern kann

funky

von sdg (Gast)


Lesenswert?

funky schrieb:
> Ich sehe da eigentlich nicht wirklich eine typische
> for-Abbruchbedingung

Hier:
1
c = *ptr++
 entspricht (im Kontext)
1
(c = *ptr++)!=0
, da hast du deine Bedingung...

Wichtig: Der String MUSS NULLTERMINIERT sein, sonst wird das nichts.

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

... und weiterhin darf auch kein Nullwert im String enthalten sein, da 
die Schleife sonst vorzeitig abbricht.

von funky (Gast)


Lesenswert?

ok, das macht schonmal mehr Sinn, als ich mir bisher zusammenreimen 
konnte ;)
Dann muss ich mal schauen was da im Fehlerfall genau in meinem Array 
enthalten ist

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.