<?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[reinterpret_cast bzw. memcpy fuer structs mit char[]]]></title><description><![CDATA[<p>Hallo alle zusammen!</p>
<p>Ich arbeite seit geraumer Zeit schon an diesem problem und bin mir nicht sicher, ob ich den Grund fuer mein &quot;Versagen&quot; endlich gefunden habe. Also wollte ich mal die Allgemeinheit fragen (die sicherlich mehr weiss als ich).</p>
<p>Ich schreib das mal etwas grundlegender als in meinem Programm, damit das Einlesen nich ewig dauert:</p>
<p>Mein struct:</p>
<pre><code class="language-cpp">struct MyStruct
{
  float a;
  long b;
  long c;
  char d[20];
  char e[20];
  float f;
}
</code></pre>
<p>Meine template-class:</p>
<pre><code class="language-cpp">template &lt;class A&gt;
class MyClass
{
private:
  A* MyStructInClass; //class A ist das struct von oben

public:
  void InitFromBuffer(char* Buffer);
}
</code></pre>
<p>Ich bekomme jetzt einen char-pointer mit der Byte-Laenge der struct in dem die Daten liegen, die ich benoetige und will diese in MyStructInClass speichern:</p>
<pre><code class="language-cpp">void MyClass&lt;MyStruct&gt;::InitFromBuffer(char* Buffer)
{
  memcpy(this-&gt;MyStructInClass, Buffer, sizeof(MyStruct));
}
</code></pre>
<p>Das klappt nicht (Fehler wegen korruptem Speicher). Liegt nach meiner Ansicht daran, dass ich versuche den Speicher eines members zu ueberschreiben.</p>
<p>Meine Alternative:</p>
<pre><code class="language-cpp">void MyClass&lt;MyStruct&gt;::InitFromBuffer(char* Buffer)
{
  this-&gt;MyStructInClass = reinterpret_cast&lt;MyStruct*&gt;(Buffer);
}
</code></pre>
<p>Das klappt zwar ohne Runtime-Error, aber es steht meistens nich das gewuenschte in MyStructInClass:</p>
<p>a, b und c haben noch die korrekten Werte. Aber ab dem Array d stimmen die Werte nicht mehr.</p>
<p>Meine Begruendung:<br />
C++ (bzw. .NET) verarbeitet char[20] als char*, d.h. man kann einen char[20] sowohl mit einem char* der Laenge 5 fuellen, als auch der Laenge 50. Zur Laufzeit wird der Speicher dynamisch angepasst.<br />
Fuelle ich char d[20] mit &quot;aaa&quot;, hat d die Groesse 3 Byte, bei &quot;12345678901234567890123&quot; die Groesse 23 Byte.<br />
Prinzipiell macht das meine Metjode damit wohl nicht-implementierbar <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":-/"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/154821/reinterpret_cast-bzw-memcpy-fuer-structs-mit-char</link><generator>RSS for Node</generator><lastBuildDate>Tue, 08 Sep 2026 03:27:24 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/154821.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 31 Jul 2006 08:30:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to reinterpret_cast bzw. memcpy fuer structs mit char[] on Mon, 31 Jul 2006 08:30:00 GMT]]></title><description><![CDATA[<p>Hallo alle zusammen!</p>
<p>Ich arbeite seit geraumer Zeit schon an diesem problem und bin mir nicht sicher, ob ich den Grund fuer mein &quot;Versagen&quot; endlich gefunden habe. Also wollte ich mal die Allgemeinheit fragen (die sicherlich mehr weiss als ich).</p>
<p>Ich schreib das mal etwas grundlegender als in meinem Programm, damit das Einlesen nich ewig dauert:</p>
<p>Mein struct:</p>
<pre><code class="language-cpp">struct MyStruct
{
  float a;
  long b;
  long c;
  char d[20];
  char e[20];
  float f;
}
</code></pre>
<p>Meine template-class:</p>
<pre><code class="language-cpp">template &lt;class A&gt;
class MyClass
{
private:
  A* MyStructInClass; //class A ist das struct von oben

public:
  void InitFromBuffer(char* Buffer);
}
</code></pre>
<p>Ich bekomme jetzt einen char-pointer mit der Byte-Laenge der struct in dem die Daten liegen, die ich benoetige und will diese in MyStructInClass speichern:</p>
<pre><code class="language-cpp">void MyClass&lt;MyStruct&gt;::InitFromBuffer(char* Buffer)
{
  memcpy(this-&gt;MyStructInClass, Buffer, sizeof(MyStruct));
}
</code></pre>
<p>Das klappt nicht (Fehler wegen korruptem Speicher). Liegt nach meiner Ansicht daran, dass ich versuche den Speicher eines members zu ueberschreiben.</p>
<p>Meine Alternative:</p>
<pre><code class="language-cpp">void MyClass&lt;MyStruct&gt;::InitFromBuffer(char* Buffer)
{
  this-&gt;MyStructInClass = reinterpret_cast&lt;MyStruct*&gt;(Buffer);
}
</code></pre>
<p>Das klappt zwar ohne Runtime-Error, aber es steht meistens nich das gewuenschte in MyStructInClass:</p>
<p>a, b und c haben noch die korrekten Werte. Aber ab dem Array d stimmen die Werte nicht mehr.</p>
<p>Meine Begruendung:<br />
C++ (bzw. .NET) verarbeitet char[20] als char*, d.h. man kann einen char[20] sowohl mit einem char* der Laenge 5 fuellen, als auch der Laenge 50. Zur Laufzeit wird der Speicher dynamisch angepasst.<br />
Fuelle ich char d[20] mit &quot;aaa&quot;, hat d die Groesse 3 Byte, bei &quot;12345678901234567890123&quot; die Groesse 23 Byte.<br />
Prinzipiell macht das meine Metjode damit wohl nicht-implementierbar <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":-/"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1107537</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1107537</guid><dc:creator><![CDATA[WetDreams]]></dc:creator><pubDate>Mon, 31 Jul 2006 08:30:00 GMT</pubDate></item><item><title><![CDATA[Reply to reinterpret_cast bzw. memcpy fuer structs mit char[] on Mon, 31 Jul 2006 08:38:11 GMT]]></title><description><![CDATA[<p>Du hast einen Pointer - aber der zeigt zunächst noch nirgendwohin. Wenn du jetzt über diesen Pointer etwas schreiben willst, gibt's (mit etwas Glück) eine nette Fehlermeldung des Systems. Deshalb solltest du vor dem memcpy()-Aufruf erstmal genug Speicher für dein Struct anlegen, den du dann füllen kannst:</p>
<pre><code class="language-cpp">void MyClass&lt;MyStruct&gt;::InitFromBuffer(char* Buffer)
{
  MyStructInClass = malloc(sizeof(MyStruct));
  memcpy(this-&gt;MyStructInClass, Buffer, sizeof(MyStruct));
}
</code></pre>
<p>(btw, wozu brauchst du eigentlich an der Stelle Templates?)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1107546</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1107546</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 31 Jul 2006 08:38:11 GMT</pubDate></item><item><title><![CDATA[Reply to reinterpret_cast bzw. memcpy fuer structs mit char[] on Mon, 31 Jul 2006 08:40:24 GMT]]></title><description><![CDATA[<p>Zu der &quot;abenteuerlichen&quot; Vermutung <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Nein, d ist immer 20 Bytes lang. Wenn Du nur 3 Bytes hineinschreibst, sind eben 17 Bytes &quot;leer&quot; (es steht das drin was vor dem kopieren auch drin stand - meistens Speichermüll), wenn Du 23 Bytes hineinschreibst, überschreibst Du die ersten drei Bytes von e.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1107549</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1107549</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Mon, 31 Jul 2006 08:40:24 GMT</pubDate></item><item><title><![CDATA[Reply to reinterpret_cast bzw. memcpy fuer structs mit char[] on Mon, 31 Jul 2006 08:43:03 GMT]]></title><description><![CDATA[<p>Im eigentlichen Code gibt es mehrere (viele) structs die generiert werden aus einer Exel-Tabelle (projekt-abhaengig).</p>
<p>Durch das template koennten diese (halbwegs) dynamisch genutzt werden, und erspart damit eine Menge Arbeit weil man nicht antausenden Stellen alles neu implementieren muss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1107552</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1107552</guid><dc:creator><![CDATA[WetDreams]]></dc:creator><pubDate>Mon, 31 Jul 2006 08:43:03 GMT</pubDate></item><item><title><![CDATA[Reply to reinterpret_cast bzw. memcpy fuer structs mit char[] on Mon, 31 Jul 2006 08:51:51 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10318">@CStoll</a>:<br />
Danke fuer den Tipp! Nur ein kleiner Fehler war noch:</p>
<pre><code class="language-cpp">void MyClass&lt;MyStruct&gt;::InitFromBuffer(char* Buffer)
{
  MyStructInClass = (MyStruct*)malloc(sizeof(MyStruct));
  memcpy(this-&gt;MyStructInClass, Buffer, sizeof(MyStruct));
}
</code></pre>
<p>Bin aber noch net sicher, ob das laeuft, werds aber dann hier schreiben sobald ichs getestet habe.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10648">@LordJaxom</a>:<br />
Die &quot;abenteuerlichen&quot; Vermutungen kommen immer dann, wenn man keinen Grund fuer Fehler findet <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>War bisher ja auch deiner Meinung, aber das hier liess mich zweifeln.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1107560</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1107560</guid><dc:creator><![CDATA[WetDreams]]></dc:creator><pubDate>Mon, 31 Jul 2006 08:51:51 GMT</pubDate></item><item><title><![CDATA[Reply to reinterpret_cast bzw. memcpy fuer structs mit char[] on Mon, 31 Jul 2006 10:19:45 GMT]]></title><description><![CDATA[<p>Ok, ich danke!!!</p>
<p>Die uebrigen Fehler liegen nich an mir <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1107611</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1107611</guid><dc:creator><![CDATA[WetDreams]]></dc:creator><pubDate>Mon, 31 Jul 2006 10:19:45 GMT</pubDate></item></channel></rss>