000
30.09.2004, 23:28 Uhr
Pablo
Supertux (Operator)
|
Hi
ich hab folgendes:
C++: |
int copy(CLAUSE* dest, const CLAUSE* src) {
LITERAL* literal; size_t len; size_t mem;
if(!dest || dest->literals || !src || !src->literals) return 0;
len = litlen(src->literals); mem = sizeof(LITERAL)*len+sizeof(LITERAL);
printf("mem=%d\n", mem);
literal = malloc(mem);
if(!literal) return 0;
literal=memmove(literal,src->literals, mem);
if(!literal) return 0;
dest->literals=literal;
return 1; }
|
wobei LITERAL und CLAUSE so aussehen:
C++: |
#define LITERAL int
typedef struct S_CLAUSE { LITERAL* literals; } CLAUSE;
|
Ich bekomme eine Variable von Typ int*, die Member in src ist. src->literals enthält eine Reihe von Zahlen 2,3,1,3,0, die immer mit einer 0 enden. Die Funktion litlen liefert die Anzahl der Objekte in src->literals ohne die 0 gezählt zu haben, d.h. litlen(2,3,1,3,0)=4.
Ich den kompletten Inhalt kopieren, deshalb definiere ich LITERAL* literal; und berechne den Platz den ich brauche, das wäre nämlich sizeof(LITERAL)*len+sizeof(LITERAL); weil ich die 0 auch kopieren will. Oder hab ich da einen Denkfehler?
Wenn ich beide Reihen auf dem Monitor ausgebe, bekomme ich für folgendes: {2, 22, 18, -23, 21, -31, -254, 54, 354, -454} Wenn ich die kopierte Reihe ausgebe, bekomme ich aber: {2, 22, 18, -23, 21, 49, -254, 54, 354, -454} mem ist in diesem Beispiel 44, also 11*sizeof(LITERAL), hab das erwartet.
wieso hat sich die -31 in 49 verwandelt? Wo hab ich nen Fehler gemacht?
Das komische ist, wenn ich die erste Reihe nochmal ausgeben, (nach dem ich copy aufgerufen habe) bekomme ich {2, 22, 18, -23, 21, 49, 2, 22, 18, -23, 21, 49, -254, 54, 354, -454} -- A! Elbereth Gilthoniel! silivren penna míriel o menel aglar elenath, Gilthoniel, A! Elbereth! Dieser Post wurde am 30.09.2004 um 23:35 Uhr von Pablo editiert. |