<?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[Pointer casten]]></title><description><![CDATA[<p>Hallo ihr Experten,</p>
<p>ich hätte da mal ne Frage, ist folgendes erlaubt bzw. definiert ?</p>
<p>unsigned char dummy[4];</p>
<p>dummy[0] = 1;<br />
dummy[1] = 2;</p>
<p>unsigned int tmp = <em>(unsigned int</em>) dummy;</p>
<p>dummy[2] und dummy[3] ist undefiniert... wenn ich hier einen int<br />
Pointer nutze ist der Wert abhängig vom Speicherinhalt, das ist klar.<br />
Selbst wenn ich hier nur 2 Bytes lesen werde, ist das überhaupt<br />
erlaubt ?</p>
<p>Bin für jede Info dankbar !</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/207603/pointer-casten</link><generator>RSS for Node</generator><lastBuildDate>Sun, 11 Oct 2026 07:01:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/207603.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 09 Mar 2008 18:21:02 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Pointer casten on Sun, 09 Mar 2008 18:21:02 GMT]]></title><description><![CDATA[<p>Hallo ihr Experten,</p>
<p>ich hätte da mal ne Frage, ist folgendes erlaubt bzw. definiert ?</p>
<p>unsigned char dummy[4];</p>
<p>dummy[0] = 1;<br />
dummy[1] = 2;</p>
<p>unsigned int tmp = <em>(unsigned int</em>) dummy;</p>
<p>dummy[2] und dummy[3] ist undefiniert... wenn ich hier einen int<br />
Pointer nutze ist der Wert abhängig vom Speicherinhalt, das ist klar.<br />
Selbst wenn ich hier nur 2 Bytes lesen werde, ist das überhaupt<br />
erlaubt ?</p>
<p>Bin für jede Info dankbar !</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1471101</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1471101</guid><dc:creator><![CDATA[Bobble32]]></dc:creator><pubDate>Sun, 09 Mar 2008 18:21:02 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer casten on Sun, 09 Mar 2008 18:26:31 GMT]]></title><description><![CDATA[<p>Jap, ist erlaubt.<br />
Allerdings wäre folgendes sauberer:</p>
<pre><code class="language-cpp">unsigned int tmp = *reinterpret_cast&lt;unsigned int*&gt;(dummy);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1471105</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1471105</guid><dc:creator><![CDATA[Ryuzaki]]></dc:creator><pubDate>Sun, 09 Mar 2008 18:26:31 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer casten on Sun, 09 Mar 2008 21:21:24 GMT]]></title><description><![CDATA[<p>Ryuzaki schrieb:</p>
<blockquote>
<p>Jap, ist erlaubt.<br />
Allerdings wäre folgendes sauberer:</p>
<pre><code class="language-cpp">unsigned int tmp = *reinterpret_cast&lt;unsigned int*&gt;(dummy);
</code></pre>
</blockquote>
<p>wieso ?<br />
bringt es vorteile bezüglich der sicherheit bei der programmausführung ?<br />
laufzeitvorteile ?</p>
<p>oder findest du</p>
<pre><code class="language-cpp">*reinterpret_cast&lt;unsigned int*&gt;(dummy)
</code></pre>
<p>einfach nur 'optisch sauberer' als</p>
<pre><code class="language-cpp">*(unsigned int*) dummy
</code></pre>
<p><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=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1471166</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1471166</guid><dc:creator><![CDATA[wisondas]]></dc:creator><pubDate>Sun, 09 Mar 2008 21:21:24 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer casten on Sun, 09 Mar 2008 21:49:12 GMT]]></title><description><![CDATA[<p>wisondas schrieb:</p>
<blockquote>
<p>bringt es vorteile bezüglich der sicherheit bei der programmausführung ?</p>
</blockquote>
<p>Grundsätzlich sollte man immer auf die C++ Casts zurückgreifen. Die C-Style Casts sind unsicher.</p>
<p>Weitere Vorteile:<br />
1. Man sieht um was für eine Art der Umwandlung es sich handelt (in diesem Fall wird das Ergebis reinterpretiert). Sprich Lesbarkeit.<br />
2. Man kann besser nach den Stellen im Programmcode suchen.<br />
3. Je nach Art des Casts liefern die C++ Casts eine höhere Sicherheit.</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1471182</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1471182</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Sun, 09 Mar 2008 21:49:12 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer casten on Sun, 09 Mar 2008 21:52:37 GMT]]></title><description><![CDATA[<p>hmm evtl. ist union etwas passender für dein Problem als dieses rumgecaste.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1471184</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1471184</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Sun, 09 Mar 2008 21:52:37 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer casten on Sun, 09 Mar 2008 22:30:31 GMT]]></title><description><![CDATA[<p>also grundlegend sollte man es überhaupt nicht ausnutzen dass c++ und c diese ganzen pointer und speicherspiele erlauben und den code sauber halten</p>
<p>selbst mit reinterpret cast würde ich sowas nicht machen, in 99% der fälle ist die performance vernachlässigbar und es gibt sauberere lösungen</p>
<p>natürlich gibt es ausnahmen und vor allem bei fileoperationen ist es so oft bequemer und von da her würde ich sagen ok</p>
<p>also wenn du zb ne binäre datei einliest und das ist ein byte buffer der größe 1000 und du weisst die ersten 40 byte anfangend mit einem offset von 20 sind 10 unsigned integer die irgendwelche werte angeben kannst du ruhig sagen<br />
int offset = 20;<br />
unsigned int *irgendwelcheWerte = (unsigned int *)(buffer + offset);</p>
<p>oder ka.. gibt sicher mehrere szenarien wo es ok ist bzw &quot;sicher&quot;</p>
<p>aber das sind ausnahmefälle, und wenn es nicht gerade<br />
- sehr viel overhead verursachen würde es anders zu lösen<br />
- für sehr einfache operationen wie dieses starre file parsen eingesetzt wird<br />
- du wirklich wirklich weisst was du tust und dass es nicht schiefgehen wird und ansonsten ein performance bottleneck darstellen würde es über andere strukturen zu lösen<br />
- ...<br />
würde ich auf solche casts auf jeden fall verzichten</p>
<p>allein schon in deinem fall, wenn das dummy array vom typ short ist und du castest es auf ein integer array, also dein speicher sagen wir sieht so aus</p>
<pre><code>dummy[0] dummy[1] dummy[2] dummy[3] filename length width
short    short    short    short    rofl\0   int    int
</code></pre>
<p>und jetzt castest du die dummies auf unsigned int und schreibst was drauf, dabei überschreibst du den string (filename) unabsichtlich mit irgendwas und auch das \0 natürlich und der speicher sieht irgendwie so aus</p>
<pre><code>dummy[0] dummy[1] dummy[2] dummy[3] filename length             width
--- irgend was das du überschreiben hast --- (verfälschter int) int
</code></pre>
<p>und jetzt willst du filename ausgeben über %s, aber es schließt nicht mehr mit einem \0 ab weil du das überschrieben hast</p>
<p>auf ein mal erstreckt sich dein filename über ka wieviele bytes bis endlich mal sowas wie \0 kommt, vielleicht geht auch alles gut bis irgendwann auf ein mal ein bug auftritt und du wirst jahre brauchen um draufzukommen was überhaupt falsch ist bis du endlich merkst dass du deinen speicher korrupiert hast</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1471198</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1471198</guid><dc:creator><![CDATA[Vevusio]]></dc:creator><pubDate>Sun, 09 Mar 2008 22:30:31 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer casten on Mon, 10 Mar 2008 09:06:07 GMT]]></title><description><![CDATA[<p>Vevusio schrieb:</p>
<blockquote>
<p>also grundlegend sollte man es überhaupt nicht ausnutzen dass c++ und c diese ganzen pointer und speicherspiele erlauben und den code sauber halten</p>
</blockquote>
<p>Wenn du damit auf Casts anspielst: Ja. Man sollte cast vermeiden wenn nicht unbedingt erforderlich (daher lege ich auch darauf Wert das man die casts suchen kann). Aber wenn man Casts benötigt, sollte man auch auf die C++ Casts zurückgreifen.</p>
<p>Wenn du auf Zeiger und Zeigerarithmetik anspielst ist dies nunmal ein Teil von C++ (und C). Ja, man kann es auch übertreiben aber selten lassen sich Zeiger (auch bei einer sauberen Programmierung) gänzlich vermeiden. Zudem ist der Stack auch nicht so groß das du allen Speicher auf diesen packen solltest...</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1471286</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1471286</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Mon, 10 Mar 2008 09:06:07 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer casten on Mon, 10 Mar 2008 16:01:24 GMT]]></title><description><![CDATA[<p>Vevusio schrieb:</p>
<blockquote>
<p>also wenn du zb ne binäre datei einliest und das ist ein byte buffer der größe 1000 und du weisst die ersten 40 byte anfangend mit einem offset von 20 sind 10 unsigned integer die irgendwelche werte angeben kannst du ruhig sagen<br />
int offset = 20;<br />
unsigned int *irgendwelcheWerte = (unsigned int *)(buffer + offset);</p>
<p>oder ka.. gibt sicher mehrere szenarien wo es ok ist bzw &quot;sicher&quot;</p>
</blockquote>
<p>Genau dieses Szenario gehoert leider nicht dazu. Denn solcher Code ist es, der dann auf x86-CPUs laeuft, aber beim Portieren auf PPC nur zu Problemen fuehrt, weil die Byte-Reihenfolge im int andersherum ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1471558</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1471558</guid><dc:creator><![CDATA[Christoph]]></dc:creator><pubDate>Mon, 10 Mar 2008 16:01:24 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer casten on Mon, 10 Mar 2008 22:47:29 GMT]]></title><description><![CDATA[<p>naja fairer weise muss man vermutlich auch sagen dass das wohl nicht das einzige problem sein wird wenn man auf einen pda sein programm übertragen möchte<br />
sondern grundsätzlich das komplette programmdesign (gui, ram auslastung, ..)</p>
<p>ich kenne mich zwar nicht aus mit programmierung für pocket pcs aber ich schätze mal dass man programme die sowohl als auch auf einem ppc und einem pc rennen sollen vermutlich entsprechend .NET und dann ohnehin einen bytereader oder sonstige .NET file klassen benutzen werden?</p>
<p>man muss bei sowas halt immer den scope im auge behalten<br />
wenn eine zielsetzung des programms portierbarkeit auf einen pcc ist dann muss man das natürlich beachten</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1471807</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1471807</guid><dc:creator><![CDATA[Vevusio]]></dc:creator><pubDate>Mon, 10 Mar 2008 22:47:29 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer casten on Mon, 10 Mar 2008 22:50:01 GMT]]></title><description><![CDATA[<p>er meint nicht Pocket PC sondern <a href="http://de.wikipedia.org/wiki/PowerPC" rel="nofollow">http://de.wikipedia.org/wiki/PowerPC</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1471810</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1471810</guid><dc:creator><![CDATA[:o]]></dc:creator><pubDate>Mon, 10 Mar 2008 22:50:01 GMT</pubDate></item></channel></rss>