memcpy mit struct und char*
-
Hallo,
wieso funktioniert das:
struct msg { int number1; int number2; char* name1; char* name2; }; void print(void* buffer) { msg mymsg; memcpy(&mymsg,(char*)buffer,sizeof(msg)); printf("number1: %d",mymsg.number1); printf("number2: %d",mymsg.number2); printf("name1: %s",mymsg.name1); printf("name2: %s",mymsg.name2); } int main() { msg mymsg; mymsg.number1=1; mymsg.number2=2; mymsg.name1="Hello"; mymsg.name2="World!"; print(&mymsg); return 0; }Was ich nicht verstehe aber hoffentlich ihr...
Wie würdet ihr eine struct mit c strings definieren die verschiedene längen haben können und diese aus einem void buffer auslesen?Danke euch!
Gruß
Erno
-
3rno schrieb:
Was ich nicht verstehe aber hoffentlich ihr...
Das ist eigentlich ganz logisch. Du castest den Pointer auf das struct zuerst in ein void*, dann in ein char*, kopierst den Inhalt wieder an die Adresse eines gleichen Structs und gibst es dann aus. Da gehen keine Informationen verloren. Ob das Verhalten vom Standard garantiert wird, weiß ich aber nicht. (wobei... es ist ein POD, das müsste gehen)
[quote="3rno]
Wie würdet ihr eine struct mit c strings definieren die verschiedene längen haben können und diese aus einem void buffer auslesen?
[/quote]
Gar nicht.
-
Dein Code ist kein C++, also bist du im falschen Unterforum. Das gehört ins C Forum!
Dein Code ist sehr gefährlich. Du kannst die Strings nacher nicht mehr ändern, da der so "angelegte" Speicher konstant ist.
Ansonsten kannst du einfach von void * in den entsprechenden Datentyp casten.
#include <stdio.h> #include <stdlib.h> struct msg { int number1; int number2; char* name1; char* name2; }; void print(void* buffer) { msg* mymsg = (msg*) buffer; printf("number1: %d",mymsg->number1); printf("number2: %d",mymsg->number2); printf("name1: %s",mymsg->name1); printf("name2: %s",mymsg->name2); } int main() { msg mymsg; mymsg.number1=1; mymsg.number2=2; mymsg.name1 = (char *) malloc(sizeof(char) * 100); mymsg.name2 = (char *) malloc(sizeof(char) * 100); sprintf(mymsg.name1, "Hallo"); sprintf(mymsg.name2, "Bla"); print(&mymsg); free(mymsg.name1); free(mymsg.name2); return 0; }Der Code ist aber IMHO kein echtes C.
-
Du kopierst die Pointer. Die Kopien zeigen immer noch auf die Stelle, an denen deine gültigen Strings stehen. Glaub aber ja nicht, dass die Strings selber kopiert wurden, das wäre Jürgen-Wolf-Magie.
-
Das funktioniert genau so:
struct test { char x[3]; char y[4]; }; int main(int argc, char* argv[]) { test t; memcpy(t.x, "AB", 3); memcpy(t.y, "123", 4); void *pv = &t; test t2; memcpy(&t2, pv, sizeof(test)); // t2.x == "AB", t2.y == "123" return 0; }Aber ehrlich: als Verständnisfrage OK, aber bitte nicht wirklich einsetzen, wenn es sich irgendwie vermeiden läßt (und das läßt es sich praktisch immer).