<?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[Kontainergrößen]]></title><description><![CDATA[<p>Hey ihr,</p>
<p>Arrays, Vektoren und andere sequenzielle Kontainer haben immer eine Dimension, also die Anzahl ihrer Elemente.<br />
Im Netz und auch in meinem Buch steht über Beispielsweise das folgende Array:</p>
<pre><code>int cola[3]
</code></pre>
<p>, dass es ein Array ist, was über 3 Elemente verfügt.</p>
<pre><code>int cola[3];

   cola[0] = 2;
   cola[1] = 4;
   cola[2] = 6;
   cola[3] = 8;
</code></pre>
<p>Wenn ich jedoch bei 0 anfang verfügt es ja eigentlch über 4 Elemente.<br />
Der Quelltext oben funktioniert auch und es gibt keinen Bufferoverflow.</p>
<p>Bei Vektoren ist es eigentlich das selbe:</p>
<pre><code>vector&lt;int&gt; flasche(3);
   flasche[0] = 2;
   flasche[1] = 4;
   flasche[2] = 6;
   flasche[3] = 8;
</code></pre>
<p>Dieser Code funktioniert- aber nach Büchern oder Seiten im Netz müsste der Quelltext eigentlich einen Overflow verursachen.</p>
<p>Kann mich hier jemand über diesen 'Fehler' in der Programmierliteratur aufklären oder mir sagen, wo der Denkfehler liegt?</p>
<p>cya<br />
David</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/199221/kontainergrößen</link><generator>RSS for Node</generator><lastBuildDate>Fri, 02 Oct 2026 21:42:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/199221.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 30 Nov 2007 07:26:58 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Kontainergrößen on Fri, 30 Nov 2007 07:26:58 GMT]]></title><description><![CDATA[<p>Hey ihr,</p>
<p>Arrays, Vektoren und andere sequenzielle Kontainer haben immer eine Dimension, also die Anzahl ihrer Elemente.<br />
Im Netz und auch in meinem Buch steht über Beispielsweise das folgende Array:</p>
<pre><code>int cola[3]
</code></pre>
<p>, dass es ein Array ist, was über 3 Elemente verfügt.</p>
<pre><code>int cola[3];

   cola[0] = 2;
   cola[1] = 4;
   cola[2] = 6;
   cola[3] = 8;
</code></pre>
<p>Wenn ich jedoch bei 0 anfang verfügt es ja eigentlch über 4 Elemente.<br />
Der Quelltext oben funktioniert auch und es gibt keinen Bufferoverflow.</p>
<p>Bei Vektoren ist es eigentlich das selbe:</p>
<pre><code>vector&lt;int&gt; flasche(3);
   flasche[0] = 2;
   flasche[1] = 4;
   flasche[2] = 6;
   flasche[3] = 8;
</code></pre>
<p>Dieser Code funktioniert- aber nach Büchern oder Seiten im Netz müsste der Quelltext eigentlich einen Overflow verursachen.</p>
<p>Kann mich hier jemand über diesen 'Fehler' in der Programmierliteratur aufklären oder mir sagen, wo der Denkfehler liegt?</p>
<p>cya<br />
David</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1412685</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1412685</guid><dc:creator><![CDATA[777]]></dc:creator><pubDate>Fri, 30 Nov 2007 07:26:58 GMT</pubDate></item><item><title><![CDATA[Reply to Kontainergrößen on Fri, 30 Nov 2007 07:39:18 GMT]]></title><description><![CDATA[<p>cola[3] ist bei einem C-Array erst einmal nichts anderes als die Speicheradresse hinter dem Array. Ob du eine Speicherzugriffsverletzung erzeugst ist davon abhängig was du mit dieser Adresse anfängst. Veränderst du den Speicher, wird dir das Betriebssystem zur Laufzeit eine Speicherzugrifsverletzung um die Ohren werfen.<br />
Bei den STL-Containern ist das ein bißchen anders. Diese können dynamisch wachsen... also wird das Element an der Stelle wohl angelegt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1412687</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1412687</guid><dc:creator><![CDATA[MathiasTemp]]></dc:creator><pubDate>Fri, 30 Nov 2007 07:39:18 GMT</pubDate></item><item><title><![CDATA[Reply to Kontainergrößen on Fri, 30 Nov 2007 07:44:51 GMT]]></title><description><![CDATA[<p>MathiasTemp schrieb:</p>
<blockquote>
<p>cola[3] ist bei einem C-Array erst einmal nichts anderes als die Speicheradresse hinter dem Array. Ob du eine Speicherzugriffsverletzung erzeugst ist davon abhängig was du mit dieser Adresse anfängst. Veränderst du den Speicher, wird dir das Betriebssystem zur Laufzeit eine Speicherzugrifsverletzung um die Ohren werfen.</p>
</blockquote>
<p>Nein - was da passiert, ist schlicht undefiniert - und meistens steht an dieser Stelle die nächste Variable, die du in der Funktion angelegt hast.</p>
<blockquote>
<p>Bei den STL-Containern ist das ein bißchen anders. Diese können dynamisch wachsen... also wird das Element an der Stelle wohl angelegt.</p>
</blockquote>
<p>ZUmindest beim vector wird da nichts angelegt - der schreibt einfach ungeprüft hinter seine Daten (mit Glück liegt das noch innerhalb seiner Kapazität, dann passiert nichts - außer daß die Daten bei der nächsten Gelegenheit ins Nirvana verschwinden könnten, mit etwas Pech zerlegst du mit der Zuweisung interne Steuerdaten des Heap-Managers).</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13375">@777</a>: Beim Anlegen eines Arrays oder Containers gibst du die Größe an - da C++ bei Null mit den Indizes beginnt, ist der höchste zulässige Index 'Größe-1' (und in beiden Beispielen ist der Zugriff auf das Element 'feld[3]' undefiniert).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1412690</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1412690</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 30 Nov 2007 07:44:51 GMT</pubDate></item><item><title><![CDATA[Reply to Kontainergrößen on Fri, 30 Nov 2007 07:45:14 GMT]]></title><description><![CDATA[<p>777 schrieb:</p>
<blockquote>
<p>Der Quelltext oben funktioniert auch und es gibt keinen Bufferoverflow.</p>
</blockquote>
<p>Doch, gibts es <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="😉"
    /> Ein Bufferoverflow &quot;passiert&quot; ja nicht einfach, er wird verursacht, und zwar unabhängig davon, ob es eine Fehlermeldung gibt oder nicht. In deinem Fall hast du einen Buffer-Overflow, der keine Fehlermeldung verursacht..<br />
Hast du auch schön mit Debug kompiliert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1412692</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1412692</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Fri, 30 Nov 2007 07:45:14 GMT</pubDate></item><item><title><![CDATA[Reply to Kontainergrößen on Fri, 30 Nov 2007 08:08:12 GMT]]></title><description><![CDATA[<p>Achso... *uff* hatte echt schon gedacht, dass ich jetzt von Arrays doch was falsches gedacht hätte...</p>
<p>Naja- mich wundert das ganze nur, weil cola[3] = 8 keinen Fehler verursacht, aber cola[4] = 10 ganz gewaltig meckert.</p>
<p>Also muss ja cola 3 doch noch irgendwie... definiert sein.<br />
Das beim Vector einfach was hinzugefügt wird glaube ich nicht.<br />
Weil wozu dann push_back, push_front, insert?</p>
<pre><code>#include &lt;iostream&gt;
using namespace std;
int main(void)
{
   int cola[1];
   cola[3] = 4;
   cout &lt;&lt; cola[3] &lt;&lt; endl;
   cola[4] = 5;
   cout &lt;&lt; cola[4] &lt;&lt; endl;
   system(&quot;Pause&quot;);
}
</code></pre>
<p>Letzriger Quelltext funktioniert sogar... aber vermutlich liegts dann einfach daran, was Cstoll gesagt hat, dass es eben nur durch 'Glück' funktioniert <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>cya<br />
David</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1412698</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1412698</guid><dc:creator><![CDATA[777]]></dc:creator><pubDate>Fri, 30 Nov 2007 08:08:12 GMT</pubDate></item><item><title><![CDATA[Reply to Kontainergrößen on Fri, 30 Nov 2007 08:21:13 GMT]]></title><description><![CDATA[<p>777 schrieb:</p>
<blockquote>
<p>Naja- mich wundert das ganze nur, weil cola[3] = 8 keinen Fehler verursacht, aber cola[4] = 10 ganz gewaltig meckert.</p>
</blockquote>
<p>Ob es &quot;gewaltig meckert&quot;, liegt vor allem daran, welche Daten du bei deinem Überlauf schrottest - das können andere Variablen der Funktion sein (inklusive der Parameter), ungenutzte Stack-Abschnitte, aber auch die Rücksprungadresse. Im ersteren Fall bekommst du im weiteren Verlauf vermutlich unsinnige Daten, im letzten Fall kann <strong>alles</strong> passieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1412701</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1412701</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 30 Nov 2007 08:21:13 GMT</pubDate></item><item><title><![CDATA[Reply to Kontainergrößen on Fri, 30 Nov 2007 09:17:04 GMT]]></title><description><![CDATA[<p>Trotzdem gut zu wissen, dass C++ nicht selbst auf solche Fehler achtet, sondern den Programmierer einfach ins Ungewisse rennen lässt <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="😉"
    /><br />
Naja- dann weiß ich ja jetzt bescheid *thx* <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="😉"
    /> <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/1412733</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1412733</guid><dc:creator><![CDATA[777]]></dc:creator><pubDate>Fri, 30 Nov 2007 09:17:04 GMT</pubDate></item><item><title><![CDATA[Reply to Kontainergrößen on Fri, 30 Nov 2007 09:31:34 GMT]]></title><description><![CDATA[<p>Auch ein Programmierer sollte wissen was er tut.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1412742</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1412742</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Fri, 30 Nov 2007 09:31:34 GMT</pubDate></item><item><title><![CDATA[Reply to Kontainergrößen on Fri, 30 Nov 2007 09:48:57 GMT]]></title><description><![CDATA[<p>schaue dir doch einfach mal die Warnings an:</p>
<blockquote>
<p>botest.cpp(6) : warning C6201: Index '3' is out of valid index range '0' to '0' for possibly stack allocated buffer 'cola'<br />
botest.cpp(7) : warning C6201: Index '3' is out of valid index range '0' to '0' for possibly stack allocated buffer 'cola'<br />
botest.cpp(8) : warning C6201: Index '4' is out of valid index range '0' to '0' for possibly stack allocated buffer 'cola'<br />
botest.cpp(9) : warning C6201: Index '4' is out of valid index range '0' to '0' for possibly stack allocated buffer 'cola'<br />
botest.cpp(6) : warning C6386: Buffer overrun: accessing 'cola', the writable size is '4' bytes, but '16' bytes might be written: Lines: 5, 6<br />
botest.cpp(7) : warning C6385: Invalid data: accessing 'cola', the readable size is '4' bytes, but '16' bytes might be read: Lines: 5, 6, 7</p>
</blockquote>
<p>Sowas fängt eigentlich jeder code static analyzer ab.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1412750</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1412750</guid><dc:creator><![CDATA[Superlexx]]></dc:creator><pubDate>Fri, 30 Nov 2007 09:48:57 GMT</pubDate></item></channel></rss>