Mich wundert nur, daß das folgende Programm eben nicht klappt:
#include <stdio.h> #include <string.h> #include <gdbm.h>
int main() { datum val,key; const char *name;
....
val = gdbm_fetch(db,key);
/* val.dptr ist (char *) val.dsize ist (int) und besitzt die korrekte Länge von val.dptr */
memcpy(name,val.dptr,val.dsize);
return 0; }
Mich nicht :-) ... weillllll ... memcpy kopiert die Daten von val.dptr nach name, val.dsize bytes. Wo aber ist name ??? Im Wald ! ... oder besser nicht initialisiert. Also: a) Du kennst das Maximum M von val.dsize char name[<M>]; b) Du kennst es nicht: int main() { ... char *name; ... val = gdbm_fetch(db, key); name = (char*)malloc(val.dsize*sizeof(char)); memcpy(name, val.dptr, val.dsize); ... free(name); return 0; } Dabei musst Du ausserdem noch aufpassen, das die \0 richtig verarbeitet wird! Also entweder strlen()+1 in die Datenbank oder nach memcpy() name[val.dsize]=0 ... dann muss name aber immer ein byte mehr haben !
Willi
On Wed, Dec 08, 1999 at 01:03:35PM +0100, karl-heinz.fandrey@amd.com wrote:
val = gdbm_fetch(db, key); name = (char*)malloc(val.dsize*sizeof(char)); memcpy(name, val.dptr, val.dsize);
Nach erneuter Lektuere des gdbm-Manuals muss ich sagen, dass ich Unsinn geschrieben habe. Die gdbm_-Funktionen reservieren den Speicherplatz fuer val.dptr (und alle anderen Zeiger) selbst, dafuer muss der Programmierer ihn wieder mit free() freigeben, wenn er ihn nicht mehr benoetigt. Alle anderen DBMs und auch die Kompatibilitaetsfunktionen der GDBM (also die, die nicht mit gdbm_ anfangen) arbeiten genau anders herum, also wie bisher beschrieben. Entschuldigt bitte die Konfusion.
Tschuess Torsten
lug-dd@mailman.schlittermann.de