Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » memcpy

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
10.09.2006, 03:26 Uhr
Pablo
Supertux
(Operator)


Hi

weiß jemand, was das ANSI C Standard sagt, wenn man memcpy bzw. memmove benutzt und die Anazhl der Bytes auf 0 setzt? also


C++:
memmove(dest, src, 0);


--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
10.09.2006, 08:56 Uhr
virtual
Sexiest Bit alive
(Operator)


Das ist schon erlaubt, der Standard sagt hier nichts explizit von undefiniertem Verhalten, so daß man davon ausgehen kann, daß das getan wird, was man intuitiv erwarten könnte: nichts.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
10.09.2006, 15:22 Uhr
Pablo
Supertux
(Operator)


gut, denn das war mein Problem, ich wusste nicht, ob das ein undefiniertes Verhalten mit sich bringt, selbst die glibc ändert das Verhalten je nach Version. Z.b.


C++:
printf("%s", NULL);



ältere versionen enden mit einem segfault, neuere schreiben "(null)" in den stdout Puffer. Ich dachte, vielleicht kann sowas dabei passieren.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 10.09.2006 um 15:23 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
10.09.2006, 21:14 Uhr
virtual
Sexiest Bit alive
(Operator)


Was hat denn jetzt das printf mit dem memcpy zu tun???
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
10.09.2006, 21:40 Uhr
Pablo
Supertux
(Operator)


nichts, ich meinte nur dass das undefinierte Verhalten sich nach unterschiedlichen Versionen ändern kann, ist auch nicht so wichtig jetzt.


Angenommen, ich hab:


C++:
char *tmp1, *tmp2;

tmp1 = malloc(len);



Im Laufe des Programmes mache ich ein


C++:
tmp2 = realloc(tmp1, len - 5);

if(!tmp2) /* fehler ausgeben, sofort beenden */

tmp1 = tmp2;

memmove(tmp1 + 3 , tmp1 + len - 4, 3);



was passiert jetzt? tmp1 + len - 4 landet nämlich auf dem Bereich, der durch realloc freigegeben wurde. Was passiert eigentlich mit diesem freigegebenen Bereich? Wird er auf 0 gesetzt oder so? Kann es sein, dass unter Umständen Müll kopiert wird? Sollte ich da nicht lieber zuerst kopieren und erst dann realloc aufrufen? (im Falle, dass realloc weniger Speicher reserviert wie oben)
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 10.09.2006 um 21:41 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
11.09.2006, 08:00 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat von Pablo:
jetzt? tmp1 + len - 4 landet nämlich auf dem Bereich, der durch realloc freigegeben wurde. Was passiert eigentlich mit diesem freigegebenen Bereich? Wird er auf 0 gesetzt oder so? Kann es sein, dass unter Umständen Müll kopiert wird? Sollte ich da nicht lieber zuerst kopieren und erst dann realloc aufrufen? (im Falle, dass realloc weniger Speicher reserviert wie oben)


Also was mit dem freigegebenen Platz passiert, hängt von der Implementierung ab und ist nicht vom Standard festgelegt. "Normale" Laufzeitumgebungen werden aus Effizienzgründen garnichts tun und den Speicher weder durchnullen noch sonstwas machen. In Debug-Laufzeitumgebungen kann es passieren, daß der Speicher mit einem bestimmten Bytemuster reinitialisiert wird.

Letztlich ists aber egal: Ein Zugriff auf Speicher, der Dir nicht (mehr) gehört ist generell nicht zuläassig. Wierum Du nun vorgehst (erstmemmove, dann realloc oder anders rum) ist egal: in beiden Fällen musst Du die Speicherbereichsgrenzen einhalten.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
11.09.2006, 08:15 Uhr
ao

(Operator)



Zitat von virtual:
Wierum Du nun vorgehst (erstmemmove, dann realloc oder anders rum) ist egal: in beiden Fällen musst Du die Speicherbereichsgrenzen einhalten.

Wobei "erst memmove, dann realloc" legal wäre, denn vor dem realloc ist der Speicher noch in voller Länge gültig. Nur "Erst realloc, dann memmove" ist illegal.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
11.09.2006, 12:23 Uhr
Pablo
Supertux
(Operator)


ok, vielen Dank, dann mach ich halt memmove und dann realloc

Gruss
Pablo
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: