<?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[Nulltes Element eines leeren std::vectors]]></title><description><![CDATA[<p>Eine kurze Frage zur STL. Führt</p>
<pre><code class="language-cpp">std::vector&lt;T&gt; v;
T* ptr = &amp;v[0];
</code></pre>
<p>zu undefiniertem Verhalten?</p>
<p>Der C++-Standard sagt zwar Folgendes:</p>
<p>§23.2.4/1 Class template vector schrieb:</p>
<blockquote>
<p>A vector is a kind of sequence that supports random access iterators. In addition, it supports (amortized) constant time insert and erase operations at the end; insert and erase in the middle take linear time. Storage management is handled automatically, though hints can be given to improve efficiency. The elements of a vector are stored contiguously, meaning that if <code>v</code> is a <code>vector&lt;T, Allocator&gt;</code> where <code>T</code> is some type other than <code>bool</code> , then it obeys the identity <code>&amp;v[n] == &amp;v[0] + n</code> for all <code>0 &lt;= n &lt; v.size()</code> .</p>
</blockquote>
<p>Wie ich das sehe:</p>
<ul>
<li>Aus der Gleichheit <code>&amp;v[0] == &amp;v[0] + 0</code> schliesse ich nicht, dass <code>v[0]</code> bei leeren Containern überhaupt definiert ist.</li>
<li>Zumal im Fall von <code>v.size() == 0</code> das Intervall <code>0 &lt;= n &lt; 0</code> angegeben ist (also eine leere Menge), scheint es mir eher so, als hätte man diesen Fall im Standard nicht miteinbezogen.</li>
<li>Generell ist ja die Semantik von <code>v[n]</code> über <code>*(v.begin() + n)</code> definiert. Bei leeren Containern gilt <code>v.begin() == v.end()</code> , wodurch man den Past-The-End-Iterator dereferenziert, also undefiniertes Verhalten hat.</li>
</ul>
<p>Meiner Ansicht nach weist alles auf UB hin, sieht das jemand anders? Ist halt etwas schade, weil es die Generizität (gerade in Verbindung mit C-APIs) ziemlich einschränkt und Fallunterscheidungen nötig macht. Zumindest sofern man das streng nimmt.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/279400/nulltes-element-eines-leeren-std-vectors</link><generator>RSS for Node</generator><lastBuildDate>Mon, 24 Aug 2026 14:23:16 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/279400.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 26 Dec 2010 04:01:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Nulltes Element eines leeren std::vectors on Sun, 26 Dec 2010 04:01:25 GMT]]></title><description><![CDATA[<p>Eine kurze Frage zur STL. Führt</p>
<pre><code class="language-cpp">std::vector&lt;T&gt; v;
T* ptr = &amp;v[0];
</code></pre>
<p>zu undefiniertem Verhalten?</p>
<p>Der C++-Standard sagt zwar Folgendes:</p>
<p>§23.2.4/1 Class template vector schrieb:</p>
<blockquote>
<p>A vector is a kind of sequence that supports random access iterators. In addition, it supports (amortized) constant time insert and erase operations at the end; insert and erase in the middle take linear time. Storage management is handled automatically, though hints can be given to improve efficiency. The elements of a vector are stored contiguously, meaning that if <code>v</code> is a <code>vector&lt;T, Allocator&gt;</code> where <code>T</code> is some type other than <code>bool</code> , then it obeys the identity <code>&amp;v[n] == &amp;v[0] + n</code> for all <code>0 &lt;= n &lt; v.size()</code> .</p>
</blockquote>
<p>Wie ich das sehe:</p>
<ul>
<li>Aus der Gleichheit <code>&amp;v[0] == &amp;v[0] + 0</code> schliesse ich nicht, dass <code>v[0]</code> bei leeren Containern überhaupt definiert ist.</li>
<li>Zumal im Fall von <code>v.size() == 0</code> das Intervall <code>0 &lt;= n &lt; 0</code> angegeben ist (also eine leere Menge), scheint es mir eher so, als hätte man diesen Fall im Standard nicht miteinbezogen.</li>
<li>Generell ist ja die Semantik von <code>v[n]</code> über <code>*(v.begin() + n)</code> definiert. Bei leeren Containern gilt <code>v.begin() == v.end()</code> , wodurch man den Past-The-End-Iterator dereferenziert, also undefiniertes Verhalten hat.</li>
</ul>
<p>Meiner Ansicht nach weist alles auf UB hin, sieht das jemand anders? Ist halt etwas schade, weil es die Generizität (gerade in Verbindung mit C-APIs) ziemlich einschränkt und Fallunterscheidungen nötig macht. Zumindest sofern man das streng nimmt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1998883</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1998883</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 26 Dec 2010 04:01:25 GMT</pubDate></item><item><title><![CDATA[Reply to Nulltes Element eines leeren std::vectors on Sun, 26 Dec 2010 04:52:19 GMT]]></title><description><![CDATA[<p>also einen leeren <code>vector</code> vorausgesetzt...</p>
<p><code>&amp;v[0]</code> kann IMO nicht definiert sein, da <code>v[0]</code> eine Referenz zurückgeben muss (ausgenommen <code>vector&lt;bool&gt;</code> natürlich).<br />
und ich fände es <em>äusserst</em> fragwürdig, wenn der <code>vector</code> zu diesem zweck einfach ein &quot;dummy-element&quot; anlegen bzw. eine (im derzeitigen standard &quot;verbotene&quot; bzw. nicht klar erlaubte) &quot;null-referenz&quot; zurückgeben dürfte.<br />
da ich also keinen &quot;erlaubten&quot; rückgabewert für <code>v[0]</code> wüsste, behaupte ich einfach mal dass es UB sein muss. und noch ein &quot;&amp;&quot; davorzustellen ändert daran nichts.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1998884</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1998884</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 26 Dec 2010 04:52:19 GMT</pubDate></item><item><title><![CDATA[Reply to Nulltes Element eines leeren std::vectors on Sun, 26 Dec 2010 05:36:17 GMT]]></title><description><![CDATA[<p>Gibt es einen plausiblen Grund v[n] mit n==0 anders zu behandeln als jedes andere n, das die (un)Gleichun 0 &lt;= n &lt; v.size() nicht erfüllt? Ich denke nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1998888</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1998888</guid><dc:creator><![CDATA[hmpf]]></dc:creator><pubDate>Sun, 26 Dec 2010 05:36:17 GMT</pubDate></item><item><title><![CDATA[Reply to Nulltes Element eines leeren std::vectors on Sun, 26 Dec 2010 06:10:08 GMT]]></title><description><![CDATA[<p>Wozu man so ein Quatsch auch brauchen soll???</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1998891</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1998891</guid><dc:creator><![CDATA[naaaaa]]></dc:creator><pubDate>Sun, 26 Dec 2010 06:10:08 GMT</pubDate></item><item><title><![CDATA[Reply to Nulltes Element eines leeren std::vectors on Sun, 26 Dec 2010 08:29:20 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Ist halt etwas schade, weil es die Generizität (gerade in Verbindung mit C-APIs) ziemlich einschränkt und Fallunterscheidungen nötig macht. Zumindest sofern man das streng nimmt.</p>
</blockquote>
<p>Bei C musste auch prüfen, ob du nicht ein Array mit 0 Elementen hast. Das Verhalten von malloc(0) ist &quot;implementation defined&quot; entweder Nullzeiger oder ein ungültiger anderer Zeiger.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1998899</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1998899</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sun, 26 Dec 2010 08:29:20 GMT</pubDate></item><item><title><![CDATA[Reply to Nulltes Element eines leeren std::vectors on Sun, 26 Dec 2010 08:51:18 GMT]]></title><description><![CDATA[<p>Ich finde einen Zeiger auf ein Array das es nicht gibt schon toll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1998900</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1998900</guid><dc:creator><![CDATA[also]]></dc:creator><pubDate>Sun, 26 Dec 2010 08:51:18 GMT</pubDate></item><item><title><![CDATA[Reply to Nulltes Element eines leeren std::vectors on Sun, 26 Dec 2010 09:47:30 GMT]]></title><description><![CDATA[<p>v[0] ist bereits nicht definiert, da 0&lt;vec.size() gelten muss. das wird nur nicht abgefangen, siehe at().</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1998908</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1998908</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Sun, 26 Dec 2010 09:47:30 GMT</pubDate></item><item><title><![CDATA[Reply to Nulltes Element eines leeren std::vectors on Sun, 26 Dec 2010 13:34:33 GMT]]></title><description><![CDATA[<p>Danke allen für die Bestätigung.</p>
<p>@ naaaaa und SeppJ:<br />
Ich dachte halt an sowas:</p>
<pre><code class="language-cpp">c_write_array(&amp;v[0], v.size());
</code></pre>
<p>Bei <code>v.size() == 0</code> würde dann einfach nichts getan. Halt wie die STL-Algorithmen, welche ebenfalls mit leeren Sequenzen umgehen können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1998962</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1998962</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 26 Dec 2010 13:34:33 GMT</pubDate></item></channel></rss>