<?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[Arrayüberlauf &#x2F; interne Speicherverwaltung]]></title><description><![CDATA[<p>Hallo,<br />
habe folgendes Miniprogramm:<br />
Frage dazu: Wenn die anzahl größer als 20 ist, wird der Speicher hinter<br />
dem Array verwendet um die Zahlen zu speichern.<br />
Da es ein int-Array ist, reserviert er doch 20 * 4 Byte,<br />
wenn ich Werte über 24 angebe durchläuft er das Array bis 24<br />
und warum kann ich überhaupt auf Werte größer 20 zugreifen?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;conio.h&gt;
#include &lt;stdlib.h&gt;

using namespace std;

int main()
{
    int anzahl;

    time_t t;
    time(&amp;t);
    srand((unsigned int)t);              /* Zufallsgenerator initialisieren */

    cout&lt;&lt;&quot;Bitte geben sie die Anzahl der zu speichernden Zahlen: &quot;&lt;&lt;endl;
    cin&gt;&gt; anzahl;
    int array[20];

    for(int i = 1; i &lt;= anzahl; i++)
    {
     array[i] = rand() % 6 + 1;            
     if(i % 10 == 0)
     {
      cout&lt;&lt; array[i] &lt;&lt;endl;
     }
     else
     {
      cout&lt;&lt; array[i];    
     }
    }
    cout&lt;&lt; endl;
    cout&lt;&lt; &quot;12 % 10 ist :&quot; &lt;&lt; 12 % 10;

    getch();
    return 0;    
}
</code></pre>
<p>gruß alex</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/179765/arrayüberlauf-interne-speicherverwaltung</link><generator>RSS for Node</generator><lastBuildDate>Mon, 21 Sep 2026 09:27:43 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/179765.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 25 Apr 2007 07:43:14 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Arrayüberlauf &#x2F; interne Speicherverwaltung on Wed, 25 Apr 2007 07:43:14 GMT]]></title><description><![CDATA[<p>Hallo,<br />
habe folgendes Miniprogramm:<br />
Frage dazu: Wenn die anzahl größer als 20 ist, wird der Speicher hinter<br />
dem Array verwendet um die Zahlen zu speichern.<br />
Da es ein int-Array ist, reserviert er doch 20 * 4 Byte,<br />
wenn ich Werte über 24 angebe durchläuft er das Array bis 24<br />
und warum kann ich überhaupt auf Werte größer 20 zugreifen?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;conio.h&gt;
#include &lt;stdlib.h&gt;

using namespace std;

int main()
{
    int anzahl;

    time_t t;
    time(&amp;t);
    srand((unsigned int)t);              /* Zufallsgenerator initialisieren */

    cout&lt;&lt;&quot;Bitte geben sie die Anzahl der zu speichernden Zahlen: &quot;&lt;&lt;endl;
    cin&gt;&gt; anzahl;
    int array[20];

    for(int i = 1; i &lt;= anzahl; i++)
    {
     array[i] = rand() % 6 + 1;            
     if(i % 10 == 0)
     {
      cout&lt;&lt; array[i] &lt;&lt;endl;
     }
     else
     {
      cout&lt;&lt; array[i];    
     }
    }
    cout&lt;&lt; endl;
    cout&lt;&lt; &quot;12 % 10 ist :&quot; &lt;&lt; 12 % 10;

    getch();
    return 0;    
}
</code></pre>
<p>gruß alex</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1272958</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1272958</guid><dc:creator><![CDATA[alexC++]]></dc:creator><pubDate>Wed, 25 Apr 2007 07:43:14 GMT</pubDate></item><item><title><![CDATA[Reply to Arrayüberlauf &#x2F; interne Speicherverwaltung on Wed, 25 Apr 2007 08:02:49 GMT]]></title><description><![CDATA[<p>C war eher auf Geschwindigkeit ausgelegt, deshalb werden Bereichsüberschreitungen auch nicht überprüft (sowas nennt sich &quot;undefiniertes Verhalten&quot;). Das heißt, du mußt schon selber dafür sorgen, daß du nicht außerhalb des reservierten Bereiches schreibst.</p>
<p>C++ hat die Array-Verarbeitung weitgehend von C geerbt (also inklusive der nicht vorhandenen Index-Überprüfung). Aber in C++ gibt es neue Containerklassen (für dich interessant sind sicher vector&lt;&gt; oder deque&lt;&gt;), die mitwachsen können - und auch eine optionale Bereichskontrolle bieten (wenn du at() anstelle von op[] für den Elementzugriff verwendest, schmiert dein Programm kontrolliert ab ;)).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1272967</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1272967</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 25 Apr 2007 08:02:49 GMT</pubDate></item><item><title><![CDATA[Reply to Arrayüberlauf &#x2F; interne Speicherverwaltung on Wed, 25 Apr 2007 08:08:03 GMT]]></title><description><![CDATA[<p>alexC++ schrieb:</p>
<blockquote>
<p>Da es ein int-Array ist, reserviert er doch 20 * 4 Byte,<br />
wenn ich Werte über 24 angebe durchläuft er das Array bis 24<br />
und warum kann ich überhaupt auf Werte größer 20 zugreifen?</p>
</blockquote>
<p>ein</p>
<pre><code class="language-cpp">int foo[ 20 ]; // reserviert 20 * sizeof( int ) Bytes auf dem Stack.
</code></pre>
<p>foo dereferenziert auf die Anfangsadresse des Speicherbereichs. Du kannst auf</p>
<pre><code class="language-cpp">foo[ 20 ]; // , das 21. Element, zugreifen weil das nichts anderes bedeutet als
*( foo + 20 * sizeof( int ) ); // und du damit auf den Speicher an der
</code></pre>
<p>errechneten Adresse zugreifst. C und C++ prüfen nicht auf ein Überschreiten von Arraygrenzen. Das Verhalten dabei ist natürlich undefiniert und geht nur gut, wenn das Betriebssystem dir nicht dazwischenspuckt (dh. idR. das Du auf den Deinem Programm zugesprochenen Datenspeicher (vgl. Data Segment) zugreifen kannst, ohne ein paar auf die Finger zu bekommen.</p>
<p>greetz, Swordfish</p>
<p>/edit: oje, 5 min zu spät!?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1272968</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1272968</guid><dc:creator><![CDATA[Swordfish]]></dc:creator><pubDate>Wed, 25 Apr 2007 08:08:03 GMT</pubDate></item><item><title><![CDATA[Reply to Arrayüberlauf &#x2F; interne Speicherverwaltung on Wed, 25 Apr 2007 08:28:48 GMT]]></title><description><![CDATA[<blockquote>
<p>int foo[ 20 ]; // reserviert 20 * sizeof( int ) Bytes auf dem Stack.</p>
</blockquote>
<p>Ich dachte das ein Array ein Verweistyp ist und deshalb Speicher vom<br />
Heap anfordert.</p>
<p>Ok das ist mir alles schon klar, wo ich nicht durchblicke ist,<br />
dass er, wenn ich 30 für die anzahl angebe, nur bis 23 läuft.<br />
Wenn es keine Bereichsüberprüfung gibt, müsste er doch dann bis 30 laufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1272981</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1272981</guid><dc:creator><![CDATA[alexC++]]></dc:creator><pubDate>Wed, 25 Apr 2007 08:28:48 GMT</pubDate></item><item><title><![CDATA[Reply to Arrayüberlauf &#x2F; interne Speicherverwaltung on Wed, 25 Apr 2007 08:37:51 GMT]]></title><description><![CDATA[<p>alexC++ schrieb:</p>
<blockquote>
<blockquote>
<p>int foo[ 20 ]; // reserviert 20 * sizeof( int ) Bytes auf dem Stack.</p>
</blockquote>
<p>Ich dachte das ein Array ein Verweistyp ist und deshalb Speicher vom<br />
Heap anfordert.</p>
</blockquote>
<p>Nein, vom Heap bekommst du nur Speicher, wenn du ihn mit new oder malloc() anforderst. Im Gegensatz zu Java arbeitet C(++) deutlich mehr mit dem Stack <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>
<blockquote>
<p>Ok das ist mir alles schon klar, wo ich nicht durchblicke ist,<br />
dass er, wenn ich 30 für die anzahl angebe, nur bis 23 läuft.<br />
Wenn es keine Bereichsüberprüfung gibt, müsste er doch dann bis 30 laufen.</p>
</blockquote>
<p>Wie Swordfish schon sagt, geht das &quot;nur gut, wenn das Betriebssystem dir nicht dazwischenspuckt&quot; - und offenbar hast du bei der 23 den Punkt erreicht, wo du aus &quot;deinem&quot; Stack-Bereich rausgeflogen bist (hinter dem Array steht auf jeden Fall noch der 'time_t t', sowie eventuell noch einige interne VErwaltungsdaten für die Funktion).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1272987</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1272987</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 25 Apr 2007 08:37:51 GMT</pubDate></item><item><title><![CDATA[Reply to Arrayüberlauf &#x2F; interne Speicherverwaltung on Wed, 25 Apr 2007 08:41:07 GMT]]></title><description><![CDATA[<p>Was ist ein &quot;Verweistyp&quot;? Ich kenne nur &quot;Typ&quot; <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>
<p>(Ich weiss schon was das ist aber dem OP ist scheinbar nicht klar, dass es in C++ keine Verweis- und Werttypen gibt, sondern einfach nur Typen im Sinne von Werttypen.)</p>
<p>@OP:<br />
Wenn Du kein &quot;new&quot; siehst, landet etwas auch nicht auf dem Heap. Was eine Klasse intern evtl. auf dem Heap konstruiert ist eine andere Sache.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1272989</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1272989</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Wed, 25 Apr 2007 08:41:07 GMT</pubDate></item><item><title><![CDATA[Reply to Arrayüberlauf &#x2F; interne Speicherverwaltung on Wed, 25 Apr 2007 09:20:47 GMT]]></title><description><![CDATA[<p>okay</p>
<p>ich sollte nicht so viel mischen C# / C++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1273013</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1273013</guid><dc:creator><![CDATA[alexC++]]></dc:creator><pubDate>Wed, 25 Apr 2007 09:20:47 GMT</pubDate></item></channel></rss>