valgrind-error invalid write of size 1
-
Guten tag an alle also ich habe eine frage bezüglich meinem code:
Also ich habe eine decode funktion geschrieben für base 64. sie funktioniert ohne probleme nur wenn ich valgrind aufrufe dann bekomme ich die fehlermeldung:
invalide write of size 1.
Invalid write bedeutet das Programm schreibt in Speicher der nicht korrekt reserviert wurde ("nicht ihm gheört").
mein code ausschnitt.*decoded = (char*) malloc(size * sizeof(char)); for(count = 0; count < size;) { decoded[0][count++] = ((LookupTable(data[0]) << 2) | (LookupTable(data[1]) >> 4 )); decoded[0][count++] = ((LookupTable(data[1]) << 4) | (LookupTable(data[2]) >> 2 )); decoded[0][count++] = ((mLookupTable(data[2]) << 6 & 0xc0) | (mLookupTable(data[3]))); } return size;
wenn nun size > 3 dann bekomme ich die fehlermeldung. weil es ja 1 mal durchläuft und danach läuft die schleife ja weiter oder!
vl hat jem. einen tipp für mich.
Danke im voraus!mfg
-
rene_ob schrieb:
Guten tag an alle also ich habe eine frage bezüglich meinem code:
Also ich habe eine decode funktion geschrieben für base 64. sie funktioniert ohne probleme nur wenn ich valgrind aufrufe dann bekomme ich die fehlermeldung:
invalide write of size 1.
Invalid write bedeutet das Programm schreibt in Speicher der nicht korrekt reserviert wurde ("nicht ihm gheört").
mein code ausschnitt.*decoded = (char*) malloc(size * sizeof(char)); for(count = 0; count < size;) { decoded[0][count++] = ((LookupTable(data[0]) << 2) | (LookupTable(data[1]) >> 4 )); decoded[0][count++] = ((LookupTable(data[1]) << 4) | (LookupTable(data[2]) >> 2 )); decoded[0][count++] = ((LookupTable(data[2]) << 6 & 0xc0) | (LookupTable(data[3]))); } return size;
wenn nun size > 3 dann bekomme ich die fehlermeldung. weil es ja 1 mal durchläuft und danach läuft die schleife ja weiter oder!
vl hat jem. einen tipp für mich.
Danke im voraus!mfg
-
Ich seh doch zwar keinen Speicherfehler, allerdings einen anderen Fehler der nichts mit deinem Problem zu tun hat:
Der Rückgabewert von malloc() wird nicht gecastet!
-
Danke für die schnelle antwort!
ja stimmt. ich weiß auch nicht wo genau mein speicherfehler liegt, da er richtig ins array schreibt nur valgrind gibt mir den fehler aus!
wenn jetz size zb. 4 ist dann:
decode[0][0] = ..
decode[0][1] = ..
decode[0][2] = ..ein schleifendurchlauf und beim 2.
decode[0][3] = ..und was passiert mit den restlichen 2 anweisungen?
decode[0][4] = ..
decode[0][5] = ..geht ja nicht da size = 4 und somit count bei decode[0][3] aufhört.
oder hört die for schleife dann automatisch auf bei decode[0][3].vl ist das mein problem!
mfg
-
Jup, das ist dein Problem. Du schreibst ja immer drei Bytes, auch wenn gar nicht mehr 3 bytes übrig sind. Also achte darauf, dass deine Größe ein vielfaches von 3 ist. Oder eben nur schreiben, wenn count < size ist.
-
Ja ok aber mein text der zu decoden ist kann/soll beliebig lang sein.
Wie kann ich das sonst lösen?
gibts da bessere lösungen/andere schleifen?mfg
-
rene_ob schrieb:
Ja ok aber mein text der zu decoden ist kann/soll beliebig lang sein.
Wie kann ich das sonst lösen?
gibts da bessere lösungen/andere schleifen?mfg
Baust du zwei ifs in die Schleife ein, die jeweils prüft ob count < size ist..
-
Super Danke funktioniert jetz toll!
Vielen danke nochmal undmfg
-
Es scheint mir sinnvoller, einfach zwei Byte mehr Speicher anzufordern. Dekodiert werden die eh zu Null-Bytes, die da niemanden stören.
Ich weiß jetzt nicht, mit wie vielen wie kurzen Strings du da hantierst, aber sofern du nicht ein paar Millionen vier Byte lange base64-Stücke dekodieren musst, dürfte der zusätzliche Speicherverbrauch vernachlässigbarer sein als der Laufzeitverlust durch zwei eigentlich ziemlich unnötige ifs in der Schleife.