wie memcpy() eine Konstante
Wie kann ich memcpy() eine Konstante in c++
ich habe zum Beispiel definiert eine Konstante mit
#define constant1 0x0080
wenn ich will
memcpy(&some_memory_block, constatnt1, 2 );
er sagt
error C2664: 'memcpy' : cannot convert parameter 2 from 'int' to 'const void *'
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sie könnten versuchen, mit einer Konstanten anstelle von einer precomiler definition.
uint16_t
eher als eineunsigned int
.Ihre Konstante (makro) ist wirklich nur ein literal. Als solche, es hat keine Adresse, die gegeben werden konnten, als parameter zu
memcpy
oder andere Funktion, die erwartet, dass ein Speicher. Wenn Sie dies tun möchten, benötigen Sie eine reelle Konstante (wieconst int
), wie bereits in den anderen Antworten.Eine echte Konstante im Gegensatz zu einem makro (das ist nur ein text-substitution, in diesem Fall für ein literal) ist normalerweise funktional identisch zu einem wörtlichen, solange Sie nicht seine Adresse. Es ist jedoch möglich, seine Adresse, an welcher Stelle es verhält sich wie eine "normale" variable. Was bedeutet, dass Sie kann Verwendung
memcpy
auf seine Adresse.Die in der Regel "korrekte" Antwort, aber: Don ' T tun diese Art der Sache überhaupt. Wenn etwas eine Konstante ist, die sollte man nicht kopieren es um (es gibt natürlich Ausnahmen, aber in der Regel gerade nicht). Der einzig gültige Grund wäre, dass Sie möchten, dass ein konstanter Wert zur Initialisierung einer nicht-Konstanten variable, aber dann ist es viel einfacher einfach zu vergeben, als zu
memcpy
.Kopien, eine Konstante, die sonst nur fügt Redundanz hinzu, frisst zusätzlichen Speicher nicht nutzen, cache erhöht Druck, und Niederlagen, die viele compiler-Optimierungen. Zum Beispiel, ein compiler kann trivial optimieren, um einen Ausdruck wie
a = b + c - c + b
zua = computed_value_of_2b
wenn er weiß, dass die Symbole sind Konstanten (sehr viel komplizierter und weniger offensichtlich-Ausdrücke werden ausgewertet auch, natürlich). Allerdings hat der compiler zu emittieren code, der wertet zur Laufzeit gegeben, wenn bestimmte Speicherbereiche, es hat keine andere Wahl.Was passieren, in Ihrem Fall ist, dass konstante1 wird ersetzt durch 0x0080, wenn Sie den code kompilieren.
Und diese Linie
wird
diese
Wenn man sich memcpy Sie werden sehen, dass memcpy requiers einen Zeiger für den zweiten parameter.
Müssen Sie assing einen Zeiger auf die memcpy