<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[memcpy mit struct und char*]]></title><description><![CDATA[<p>Hallo,</p>
<p>wieso funktioniert das:</p>
<pre><code class="language-cpp">struct  msg
{
	int number1;
	int number2;
	char* name1;
	char* name2;
};

void print(void* buffer)
{
	msg mymsg;
	memcpy(&amp;mymsg,(char*)buffer,sizeof(msg));
	printf(&quot;number1: %d&quot;,mymsg.number1);
	printf(&quot;number2: %d&quot;,mymsg.number2);
	printf(&quot;name1: %s&quot;,mymsg.name1);
	printf(&quot;name2: %s&quot;,mymsg.name2);
}

int main()
{
	msg mymsg;
	mymsg.number1=1;
	mymsg.number2=2;
	mymsg.name1=&quot;Hello&quot;;
	mymsg.name2=&quot;World!&quot;;

	print(&amp;mymsg);

	return 0;
}
</code></pre>
<p>Was ich nicht verstehe aber hoffentlich ihr...<br />
Wie würdet ihr eine struct mit c strings definieren die verschiedene längen haben können und diese aus einem void buffer auslesen?</p>
<p>Danke euch!</p>
<p>Gruß<br />
Erno</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/295122/memcpy-mit-struct-und-char</link><generator>RSS for Node</generator><lastBuildDate>Sat, 15 Aug 2026 13:34:54 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/295122.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 07 Nov 2011 17:42:08 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to memcpy mit struct und char* on Mon, 07 Nov 2011 17:42:08 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>wieso funktioniert das:</p>
<pre><code class="language-cpp">struct  msg
{
	int number1;
	int number2;
	char* name1;
	char* name2;
};

void print(void* buffer)
{
	msg mymsg;
	memcpy(&amp;mymsg,(char*)buffer,sizeof(msg));
	printf(&quot;number1: %d&quot;,mymsg.number1);
	printf(&quot;number2: %d&quot;,mymsg.number2);
	printf(&quot;name1: %s&quot;,mymsg.name1);
	printf(&quot;name2: %s&quot;,mymsg.name2);
}

int main()
{
	msg mymsg;
	mymsg.number1=1;
	mymsg.number2=2;
	mymsg.name1=&quot;Hello&quot;;
	mymsg.name2=&quot;World!&quot;;

	print(&amp;mymsg);

	return 0;
}
</code></pre>
<p>Was ich nicht verstehe aber hoffentlich ihr...<br />
Wie würdet ihr eine struct mit c strings definieren die verschiedene längen haben können und diese aus einem void buffer auslesen?</p>
<p>Danke euch!</p>
<p>Gruß<br />
Erno</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2141741</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2141741</guid><dc:creator><![CDATA[3rno]]></dc:creator><pubDate>Mon, 07 Nov 2011 17:42:08 GMT</pubDate></item><item><title><![CDATA[Reply to memcpy mit struct und char* on Mon, 07 Nov 2011 17:48:42 GMT]]></title><description><![CDATA[<p>3rno schrieb:</p>
<blockquote>
<p>Was ich nicht verstehe aber hoffentlich ihr...</p>
</blockquote>
<p>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)</p>
<p>[quote=&quot;3rno]<br />
Wie würdet ihr eine struct mit c strings definieren die verschiedene längen haben können und diese aus einem void buffer auslesen?<br />
[/quote]<br />
Gar nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2141743</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2141743</guid><dc:creator><![CDATA[wxSkip]]></dc:creator><pubDate>Mon, 07 Nov 2011 17:48:42 GMT</pubDate></item><item><title><![CDATA[Reply to memcpy mit struct und char* on Mon, 07 Nov 2011 17:52:09 GMT]]></title><description><![CDATA[<p>Dein Code ist kein C++, also bist du im falschen Unterforum. Das gehört ins C Forum!</p>
<p>Dein Code ist sehr gefährlich. Du kannst die Strings nacher nicht mehr ändern, da der so &quot;angelegte&quot; Speicher konstant ist.</p>
<p>Ansonsten kannst du einfach von void * in den entsprechenden Datentyp casten.</p>
<pre><code class="language-cpp">#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

struct  msg
{
    int number1;
    int number2;
    char* name1;
    char* name2;
};

void print(void* buffer)
{
    msg* mymsg = (msg*) buffer;

    printf(&quot;number1: %d&quot;,mymsg-&gt;number1);
    printf(&quot;number2: %d&quot;,mymsg-&gt;number2);
    printf(&quot;name1: %s&quot;,mymsg-&gt;name1);
    printf(&quot;name2: %s&quot;,mymsg-&gt;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, &quot;Hallo&quot;);
	sprintf(mymsg.name2, &quot;Bla&quot;);

    print(&amp;mymsg);

	free(mymsg.name1);
	free(mymsg.name2);

    return 0;
}
</code></pre>
<p>Der Code ist aber IMHO kein echtes C.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2141745</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2141745</guid><dc:creator><![CDATA[fghfgh]]></dc:creator><pubDate>Mon, 07 Nov 2011 17:52:09 GMT</pubDate></item><item><title><![CDATA[Reply to memcpy mit struct und char* on Mon, 07 Nov 2011 17:52:56 GMT]]></title><description><![CDATA[<p>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.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2141746</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2141746</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 07 Nov 2011 17:52:56 GMT</pubDate></item><item><title><![CDATA[Reply to memcpy mit struct und char* on Mon, 07 Nov 2011 18:06:33 GMT]]></title><description><![CDATA[<p>Das funktioniert genau so:</p>
<pre><code class="language-cpp">struct test
{
	char x[3];
	char y[4];
};

int main(int argc, char* argv[])
{
    test t;
    memcpy(t.x, &quot;AB&quot;, 3);
    memcpy(t.y, &quot;123&quot;, 4);
    void *pv = &amp;t;
    test t2;
    memcpy(&amp;t2, pv, sizeof(test));
    // t2.x == &quot;AB&quot;, t2.y == &quot;123&quot;
    return 0;
}
</code></pre>
<p>Aber ehrlich: als Verständnisfrage OK, aber bitte nicht wirklich einsetzen, wenn es sich <strong>irgendwie</strong> vermeiden läßt (und das läßt es sich praktisch immer).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2141756</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2141756</guid><dc:creator><![CDATA[Caligulaminus]]></dc:creator><pubDate>Mon, 07 Nov 2011 18:06:33 GMT</pubDate></item></channel></rss>