<?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[Puffer über Zeiger füllen]]></title><description><![CDATA[<p>Hallo ich hab dieses Programm geschrieben um mich mit Zeiger Konvertierung etwas zu beschäftigen.</p>
<p>Ich will char *buff; komplett mit dem ASCII Zeichen 3 füllen.</p>
<p>So funktioniert es.</p>
<pre><code class="language-cpp">#include &lt;iostream.h&gt;
#include &lt;fstream.h&gt;
using namespace std;

int main (int argc, char *argv[])
{
	char 	*buff, *zgr;
	long 	*adr_zgr, adr;

	int 	i;

	buff = new char [512];

	zgr = buff;
   //	adr_zgr = (long *) zgr;  // C Style
   adr_zgr =  reinterpret_cast&lt;long*&gt;( zgr );   // C++ Style

	for (i = 0; i &lt; 256 ; i+=4)
	{
		*(adr_zgr++) = 3;

	 }

	for (i = 0; i &lt; 256 ; i+=4)
	{
		cout&lt;&lt;buff[i];

	 }

	delete[] buff;
	system(&quot;PAUSE&quot;);
	return 0;
}
</code></pre>
<p>Hier bekomme ich ein EACCESS VIOLATION</p>
<p>Aber ich hab 0 Ahnung warum der Fehler auftritt.<br />
Mein Puffer kann doch 512 Byte aufnehmen</p>
<p>*(adr_zgr++) = 3; &lt;-- 1 ASCII Zeichen = 1 Byte oder ?</p>
<p>Ich schiebe 256 mal das ASCII Zeichen 3 in den Puffer wieso krieg ich da ein EACCESS Violation ?</p>
<pre><code class="language-cpp">#include &lt;iostream.h&gt;
#include &lt;fstream.h&gt;
using namespace std;

int main (int argc, char *argv[])
{
	char 	*buff, *zgr;
	long 	*adr_zgr, adr;

	int 	i;

	buff = new char [512];

	zgr = buff;
   //	adr_zgr = (long *) zgr;  // C Style
   adr_zgr =  reinterpret_cast&lt;long*&gt;( zgr );   // C++ Style

	for (i = 0; i &lt; 256 ; i++)
	{
		*(adr_zgr++) = 3;

	 }

	for (i = 0; i &lt; 256 ; i++)
	{
		cout&lt;&lt;buff[i];

	 }

	delete[] buff;
	system(&quot;PAUSE&quot;);
	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/274628/puffer-über-zeiger-füllen</link><generator>RSS for Node</generator><lastBuildDate>Thu, 27 Aug 2026 10:27:55 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/274628.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 29 Sep 2010 16:45:45 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Puffer über Zeiger füllen on Wed, 29 Sep 2010 16:45:45 GMT]]></title><description><![CDATA[<p>Hallo ich hab dieses Programm geschrieben um mich mit Zeiger Konvertierung etwas zu beschäftigen.</p>
<p>Ich will char *buff; komplett mit dem ASCII Zeichen 3 füllen.</p>
<p>So funktioniert es.</p>
<pre><code class="language-cpp">#include &lt;iostream.h&gt;
#include &lt;fstream.h&gt;
using namespace std;

int main (int argc, char *argv[])
{
	char 	*buff, *zgr;
	long 	*adr_zgr, adr;

	int 	i;

	buff = new char [512];

	zgr = buff;
   //	adr_zgr = (long *) zgr;  // C Style
   adr_zgr =  reinterpret_cast&lt;long*&gt;( zgr );   // C++ Style

	for (i = 0; i &lt; 256 ; i+=4)
	{
		*(adr_zgr++) = 3;

	 }

	for (i = 0; i &lt; 256 ; i+=4)
	{
		cout&lt;&lt;buff[i];

	 }

	delete[] buff;
	system(&quot;PAUSE&quot;);
	return 0;
}
</code></pre>
<p>Hier bekomme ich ein EACCESS VIOLATION</p>
<p>Aber ich hab 0 Ahnung warum der Fehler auftritt.<br />
Mein Puffer kann doch 512 Byte aufnehmen</p>
<p>*(adr_zgr++) = 3; &lt;-- 1 ASCII Zeichen = 1 Byte oder ?</p>
<p>Ich schiebe 256 mal das ASCII Zeichen 3 in den Puffer wieso krieg ich da ein EACCESS Violation ?</p>
<pre><code class="language-cpp">#include &lt;iostream.h&gt;
#include &lt;fstream.h&gt;
using namespace std;

int main (int argc, char *argv[])
{
	char 	*buff, *zgr;
	long 	*adr_zgr, adr;

	int 	i;

	buff = new char [512];

	zgr = buff;
   //	adr_zgr = (long *) zgr;  // C Style
   adr_zgr =  reinterpret_cast&lt;long*&gt;( zgr );   // C++ Style

	for (i = 0; i &lt; 256 ; i++)
	{
		*(adr_zgr++) = 3;

	 }

	for (i = 0; i &lt; 256 ; i++)
	{
		cout&lt;&lt;buff[i];

	 }

	delete[] buff;
	system(&quot;PAUSE&quot;);
	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1959128</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959128</guid><dc:creator><![CDATA[buffer]]></dc:creator><pubDate>Wed, 29 Sep 2010 16:45:45 GMT</pubDate></item><item><title><![CDATA[Reply to Puffer über Zeiger füllen on Wed, 29 Sep 2010 17:06:05 GMT]]></title><description><![CDATA[<blockquote>
<p>*(adr_zgr++) = 3; &lt;-- 1 ASCII Zeichen = 1 Byte oder ?</p>
</blockquote>
<p>Nein... <em>adr_zgr</em> ist ein long Pointer und bei dir ist sizeof(long) == 4. Darum wird beim inkrementieren immer 4 Byte vorangeschritten und nicht nur eins! Wenn du jetzt 256 Durchläufe in der Schleife machst landest du an der Obergrenze von 1024 Byte und dein Puffer kann nur 512 byte fassen. Du darfst also maximal 128 Durchläufe machen um die Puffergrenze nicht zu übeschreiten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959136</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959136</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Wed, 29 Sep 2010 17:06:05 GMT</pubDate></item><item><title><![CDATA[Reply to Puffer über Zeiger füllen on Wed, 29 Sep 2010 17:07:59 GMT]]></title><description><![CDATA[<p>Du musst dir erst einmal im Klaren darüber sein, wie &quot;breit&quot; ein char ist. Normalerweise, nicht zwangsläufig, ist dies ein Byte (8 Bit). Wenn du schon ein Array von 512 chars erstellst ( [0-512[ ), dann solltest du auch in der Schleife jedes Zeichen nutzen. Wolltest du in etwa so etwas machen?</p>
<pre><code class="language-cpp">int main (int argc, char *argv[])
{
    char* buff = new char [512];
	memset(buff,3,sizeof(char)*512);
	buff[511]=0;

	char* zgr = buff;

	int i=0;
	while(*zgr)
    {
		cout&lt;&lt;*(zgr++);

	}
	cout &lt;&lt; endl;
	cout &lt;&lt; buff &lt;&lt; endl;
	cout &lt;&lt; endl;

	delete buff;
	return 0;
}
</code></pre>
<p>Ich habe buff explizit nullterminiert, damit ich buff im zweiten Aufruf noch einmal komplett ausgeben lassen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959139</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959139</guid><dc:creator><![CDATA[VF]]></dc:creator><pubDate>Wed, 29 Sep 2010 17:07:59 GMT</pubDate></item><item><title><![CDATA[Reply to Puffer über Zeiger füllen on Wed, 29 Sep 2010 17:11:26 GMT]]></title><description><![CDATA[<p>VF schrieb:</p>
<blockquote>
<p>Du musst dir erst einmal im Klaren darüber sein, wie &quot;breit&quot; ein char ist. Normalerweise, nicht zwangsläufig, ist dies ein Byte (8 Bit).</p>
</blockquote>
<p>Warum sollte das wichtig sein?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959141</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959141</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Wed, 29 Sep 2010 17:11:26 GMT</pubDate></item><item><title><![CDATA[Reply to Puffer über Zeiger füllen on Wed, 29 Sep 2010 17:20:43 GMT]]></title><description><![CDATA[<p>Okay, ich meinte grundsätzlich die Differenz der Größen von char und long*.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959146</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959146</guid><dc:creator><![CDATA[VF]]></dc:creator><pubDate>Wed, 29 Sep 2010 17:20:43 GMT</pubDate></item><item><title><![CDATA[Reply to Puffer über Zeiger füllen on Wed, 29 Sep 2010 18:10:23 GMT]]></title><description><![CDATA[<p>Also, folgendes Programm</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;

int main()
{
    char* buff = new char[512];
    long* oha = reinterpret_cast&lt;long*&gt;(buff);
    unsigned const step = sizeof(long);
    for (int i = 0; i &lt; 256 ; i+=step) {
        *(oha++) = 65;
    }
    for (int i = 0; i &lt; 256 ; i+=step) {
        cout &lt;&lt; buff[i];
    }
    delete[] buff;
    return 0;
}
</code></pre>
<p>läuft bei mir und produziert folgende Ausgabe:</p>
<pre><code>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
</code></pre>
<p>Auf einem anderen Rechner kann die Ausgabe aber anders aussehen; denn das Programm ist von Implementierungsdetails abhängig (lies: &quot;unportabel&quot;). Folgende Implementierungsdetails können die Ausgabe beeinflussen:</p>
<ul>
<li>sizeof(long), CHAR_BIT (bei mir: 4, <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--smiling_face_with_sunglasses"
      title="8)"
      alt="😎"
    /></li>
<li>Byte-Ordnung (bei mir: Little Endian)</li>
<li>Zeichencodierung (bei mir: irgendwas ASCII-ähnliches)</li>
</ul>
<p>BTW: Das Programm lehnt sich stark an das an, was Du geschrieben hast. Eine der Änderungen ersetzt 4 durch sizeof(long). Du hast zwar den Puffer groß genug gemacht, so dass mit sizeof(long)==8 auch nichts schief geht, aber wenn man dieses Implementierungsdetail schon über sizeof abfragen kann, warum dann also nicht so?</p>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959187</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959187</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 29 Sep 2010 18:10:23 GMT</pubDate></item></channel></rss>