<?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[char* als key einer std::map]]></title><description><![CDATA[<p>Hallo,</p>
<pre><code class="language-cpp">struct cmp_map_key
{
   bool operator()(char* a, char* b)
   {
	   int res = strcmp(a,b);
	   return res&lt;0;
   }
};

int main()
{
	map&lt;char*,int,cmp_map_key&gt; m;

	{
		char str[] = &quot;Test&quot;;
		m[str] = 777;
	} // key zeigt ja nun auf einen freigegebenen Speicherbereich.

	char str[] = &quot;Test&quot;;
	cout &lt;&lt; m[str];
}
</code></pre>
<p>Ist das hier standardkonform? Der Speicherbereicht für das Array <code>&quot;Test&quot;</code> wird beim Verlassen des Scopes ja freigegeben. Demnach dürfte ich den key ja gar nicht mehr verwenden, oder?</p>
<p>Danke euch.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/303451/char-als-key-einer-std-map</link><generator>RSS for Node</generator><lastBuildDate>Mon, 10 Aug 2026 11:53:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/303451.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 14 May 2012 09:45:46 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to char* als key einer std::map on Mon, 14 May 2012 09:45:46 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<pre><code class="language-cpp">struct cmp_map_key
{
   bool operator()(char* a, char* b)
   {
	   int res = strcmp(a,b);
	   return res&lt;0;
   }
};

int main()
{
	map&lt;char*,int,cmp_map_key&gt; m;

	{
		char str[] = &quot;Test&quot;;
		m[str] = 777;
	} // key zeigt ja nun auf einen freigegebenen Speicherbereich.

	char str[] = &quot;Test&quot;;
	cout &lt;&lt; m[str];
}
</code></pre>
<p>Ist das hier standardkonform? Der Speicherbereicht für das Array <code>&quot;Test&quot;</code> wird beim Verlassen des Scopes ja freigegeben. Demnach dürfte ich den key ja gar nicht mehr verwenden, oder?</p>
<p>Danke euch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2211297</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2211297</guid><dc:creator><![CDATA[out]]></dc:creator><pubDate>Mon, 14 May 2012 09:45:46 GMT</pubDate></item><item><title><![CDATA[Reply to char* als key einer std::map on Mon, 14 May 2012 10:10:25 GMT]]></title><description><![CDATA[<p>Das Verhalten ist hier denke ich undefiniert. Demnach solltest du soetwas auch hier nicht machen. &quot;Standardkonform&quot; ist es damit natürlich immernoch (sonst würde es nicht kompilieren - es sei denn der Compiler compiled falsch).</p>
<p>Allgemein solltest du sowas natürlich wie die Hölle vermeiden. Selbst, wenn du es so hinbekommst, dass es funktioniert, führt es allerspätestens beim Warten und Erweitern des Codes zu Kopfschmerzen (oder wenn der Code in der Zukunft auf irgendeiner abgefahrenen Architektur oder einem Betriebssystem ausgeführt wird, dass den Stack nicht mehr so verwendet wie im Moment).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2211306</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2211306</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Mon, 14 May 2012 10:10:25 GMT</pubDate></item><item><title><![CDATA[Reply to char* als key einer std::map on Mon, 14 May 2012 10:23:58 GMT]]></title><description><![CDATA[<p>TravisG schrieb:</p>
<blockquote>
<p>Das Verhalten ist hier denke ich undefiniert. &quot;Standardkonform&quot; ist es damit natürlich immernoch (sonst würde es nicht kompilieren - es sei denn der Compiler compiled falsch).</p>
</blockquote>
<p>Das ist aber ein merkwürdiges Verständnis von &quot;standardkonform&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2211307</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2211307</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Mon, 14 May 2012 10:23:58 GMT</pubDate></item><item><title><![CDATA[Reply to char* als key einer std::map on Mon, 14 May 2012 10:30:52 GMT]]></title><description><![CDATA[<p>Ich bin gerade nur ein bischen verwirrt, weil ich im Internet nirgendwo etwas finden kann, das vor Pointern als key warnt, nicht einmal auf stackoverflow.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2211310</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2211310</guid><dc:creator><![CDATA[out]]></dc:creator><pubDate>Mon, 14 May 2012 10:30:52 GMT</pubDate></item><item><title><![CDATA[Reply to char* als key einer std::map on Mon, 14 May 2012 10:36:55 GMT]]></title><description><![CDATA[<p>out schrieb:</p>
<blockquote>
<p>Ich bin gerade nur ein bischen verwirrt, weil ich im Internet nirgendwo etwas finden kann, das vor Pointern als key warnt, nicht einmal auf stackoverflow.</p>
</blockquote>
<p>Weil Pointer nicht gefährlich sind. Du hast ja keinen Pointer sondern ein Array, das zudem im automatischen Speicherbereich liegt. Dass ein Array auch zu einem Pointer zerfallen kann ist halt mal so - dass der Pointer über die Lebensdauer der Map gültig bleibt, dafür musst du einfach selber sorgen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2211316</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2211316</guid><dc:creator><![CDATA[arghonaut]]></dc:creator><pubDate>Mon, 14 May 2012 10:36:55 GMT</pubDate></item><item><title><![CDATA[Reply to char* als key einer std::map on Mon, 14 May 2012 10:39:30 GMT]]></title><description><![CDATA[<p>Du kannst Pointer als Key verwenden. Das ist ja bei deinem Beispiel auch nicht das Problem, sondern ( wie du ja selbst festgstellt hast ) die Lebenszeit des Objekts, auf das der Pointer zeigt.<br />
Die Frage ist allerdings, warum man auf die Idee kommt, in einem C++ Programm char* statt std::string zumverwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2211319</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2211319</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Mon, 14 May 2012 10:39:30 GMT</pubDate></item><item><title><![CDATA[Reply to char* als key einer std::map on Mon, 14 May 2012 10:40:29 GMT]]></title><description><![CDATA[<p>seldon schrieb:</p>
<blockquote>
<p>TravisG schrieb:</p>
<blockquote>
<p>Das Verhalten ist hier denke ich undefiniert. &quot;Standardkonform&quot; ist es damit natürlich immernoch (sonst würde es nicht kompilieren - es sei denn der Compiler compiled falsch).</p>
</blockquote>
<p>Das ist aber ein merkwürdiges Verständnis von &quot;standardkonform&quot;.</p>
</blockquote>
<p>Macht er irgendetwas, dass dem Standard widerspricht? So verstehe ich das zumindest. Wenn alles nicht standardkonform ist, dass undefiniertes Verhalten erzeugt - na gut, dann ist das halt eine andere Definitionsmöglichkeit des Wortes.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2211320</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2211320</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Mon, 14 May 2012 10:40:29 GMT</pubDate></item><item><title><![CDATA[Reply to char* als key einer std::map on Mon, 14 May 2012 10:58:55 GMT]]></title><description><![CDATA[<p>Standardkonformes Verhalten heißt doch, dass es sich do verhält, wie der Standard es definiert. Wenn der Standard explizit sagt, dass er nichts definiert, gibts auch nichts, womit das Verhalten konform sein kann. Was man allerdings sagen kann ist, dass das Verhalten den Standard nicht verletzt - weil es eben auch nichts gitb, was man verletzen könnte in der Hinsicht.</p>
<p>Dass der oben gezeigte Code undefiniertes Verhalten erzeugt, ist ja klar, allerdings ist er sehr einfach zu reparieren:</p>
<pre><code class="language-cpp">struct cmp_map_key
{
   bool operator()(char const* a, char const* b)
   {
       int res = strcmp(a,b);
       return res&lt;0;
   }
};

int main()
{
    map&lt;char const*,int,cmp_map_key&gt; m;

    {
        char const* str = &quot;Test&quot;;
        m[str] = 777;
    } // key zeigt ja nun auf einen freigegebenen Speicherbereich.

    char const* str = &quot;Test&quot;;
    cout &lt;&lt; m[str];
}
</code></pre>
<p>Sobald man den Text nicht mehr unnötigerweise vom String-Literal in ein lokales Array kopieren lässt (unnötig weil nichts damit angestellt wird), ist das Programm völlig in Ordnung, weil ganz einfach die String-Literale selbst statische Lebenszeit haben, d.h. sie bleiben bis Programmende bestehen und damit bleiben auch die Pointer gültig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2211333</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2211333</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 14 May 2012 10:58:55 GMT</pubDate></item><item><title><![CDATA[Reply to char* als key einer std::map on Mon, 14 May 2012 11:01:46 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Standardkonformes Verhalten heißt doch, dass es sich do verhält, wie der Standard es definiert. Wenn der Standard explizit sagt, dass er nichts definiert, gibts auch nichts, womit das Verhalten konform sein kann. Was man allerdings sagen kann ist, dass das Verhalten den Standard nicht verletzt - weil es eben auch nichts gitb, was man verletzen könnte in der Hinsicht.</p>
<p>Dass der oben gezeigte Code undefiniertes Verhalten erzeugt, ist ja klar, allerdings ist er sehr einfach zu reparieren:</p>
<pre><code class="language-cpp">struct cmp_map_key
{
   bool operator()(char const* a, char const* b)
   {
       int res = strcmp(a,b);
       return res&lt;0;
   }
};

int main()
{
    map&lt;char const*,int,cmp_map_key&gt; m;

    {
        char const* str = &quot;Test&quot;;
        m[str] = 777;
    } // key zeigt ja nun auf einen freigegebenen Speicherbereich.

    char const* str = &quot;Test&quot;;
    cout &lt;&lt; m[str];
}
</code></pre>
<p>Sobald man den Text nicht mehr unnötigerweise vom String-Literal in ein lokales Array kopieren lässt (unnötig weil nichts damit angestellt wird), ist das Programm völlig in Ordnung, weil ganz einfach die String-Literale selbst statische Lebenszeit haben, d.h. sie bleiben bis Programmende bestehen und damit bleiben auch die Pointer gültig.</p>
</blockquote>
<p>Ist es wirklich definiert, dass die gleichen Literale auch wirklich die selben sind?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2211336</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2211336</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Mon, 14 May 2012 11:01:46 GMT</pubDate></item><item><title><![CDATA[Reply to char* als key einer std::map on Mon, 14 May 2012 11:06:02 GMT]]></title><description><![CDATA[<p>TravisG schrieb:</p>
<blockquote>
<p>Ist es wirklich definiert, dass die gleichen Literale auch wirklich die selben sind?</p>
</blockquote>
<p>Nein. Das darf, muss aber nicht. Ist hier aber auch nicht wichtig, da ja nicht die Zeiger verglichen werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2211338</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2211338</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Mon, 14 May 2012 11:06:02 GMT</pubDate></item><item><title><![CDATA[Reply to char* als key einer std::map on Mon, 14 May 2012 11:08:20 GMT]]></title><description><![CDATA[<p>TravisG schrieb:</p>
<blockquote>
<p>Ist es wirklich definiert, dass die gleichen Literale auch wirklich die selben sind?</p>
</blockquote>
<p>Nein. Aber dafür hat er ja den eigenen Komparator geschrieben <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> Damit werden Pointer auf die gleichen Literale von der Map immer als äquivalent betrachtet. Dass der in der map gespeicherte Pointer aus Zeile 15/16 eventuell nicht den selben <em>Wert</em> hat wie der Pointer in Zeile 19/20 macht deshalb nichts.<br />
Dazu ist definiert, dass die Literale bis Programmende gültig bleiben, also passt das so.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2211339</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2211339</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 14 May 2012 11:08:20 GMT</pubDate></item><item><title><![CDATA[Reply to char* als key einer std::map on Mon, 14 May 2012 11:12:55 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>TravisG schrieb:</p>
<blockquote>
<p>Ist es wirklich definiert, dass die gleichen Literale auch wirklich die selben sind?</p>
</blockquote>
<p>Nein. Das darf, muss aber nicht. Ist hier aber auch nicht wichtig, da ja nicht die Zeiger verglichen werden.</p>
</blockquote>
<p>Genau genommen wäre ein direkter Vergleich der Zeiger wieder unspezifiziertes Verhalten, wenn sie nicht auf Objekte im selben Array zeigen. Funktioniert natürlich trotzdem auf allen modernen Maschinen, kann aber schiefgehen auf einfachen Architekturen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2211342</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2211342</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 14 May 2012 11:12:55 GMT</pubDate></item><item><title><![CDATA[Reply to char* als key einer std::map on Mon, 14 May 2012 11:25:46 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Genau genommen wäre ein direkter Vergleich der Zeiger wieder unspezifiziertes Verhalten, wenn sie nicht auf Objekte im selben Array zeigen.</p>
</blockquote>
<p>Niemals. Wo soll das denn stehen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2211355</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2211355</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Mon, 14 May 2012 11:25:46 GMT</pubDate></item><item><title><![CDATA[Reply to char* als key einer std::map on Mon, 14 May 2012 11:28:41 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Genau genommen wäre ein direkter Vergleich der Zeiger wieder unspezifiziertes Verhalten, wenn sie nicht auf Objekte im selben Array zeigen.</p>
</blockquote>
<p><strong>Ganz</strong> genau genommen wäre das Weglassen des Komparators allerdings auch kein direkter Vergleich, sondern std::less, was wiederum für Pointer wohldefiniert ist, auch wenn sie nicht ins selbe Array zeigen, aus genau dem Grund <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>cooky451 schrieb:</p>
<blockquote>
<p>Niemals. Wo soll das denn stehen?</p>
</blockquote>
<p>Steht im Standard, dass op&lt; für Pointer nur in Arrays in Ordnung ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2211357</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2211357</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 14 May 2012 11:28:41 GMT</pubDate></item><item><title><![CDATA[Reply to char* als key einer std::map on Mon, 14 May 2012 11:42:14 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>cooky451 schrieb:</p>
<blockquote>
<p>Niemals. Wo soll das denn stehen?</p>
</blockquote>
<p>Steht im Standard, dass op&lt; für Pointer nur in Arrays in Ordnung ist.</p>
</blockquote>
<p>Hehe, jetzt habe ich es auch gefunden. Habe SeppJs unspezifiziert etwas voreilig als undefiniert abgetan. Interessant ist das aber trotzdem. Müssen ja lustige Maschinen sein, bei denen das nicht klappt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2211363</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2211363</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Mon, 14 May 2012 11:42:14 GMT</pubDate></item><item><title><![CDATA[Reply to char* als key einer std::map on Mon, 14 May 2012 12:13:01 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>Müssen ja lustige Maschinen sein, bei denen das nicht klappt.</p>
</blockquote>
<p>Ja, echt exotisch diese 286er mit ihrem MS-DOS <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> .</p>
<p>pumuckl schrieb:</p>
<blockquote>
<p>sondern std::less, was wiederum für Pointer wohldefiniert ist</p>
</blockquote>
<p>Irgendwie hatte ich das im Hinterkopf, aber ich konnte es nirgends finden.</p>
<p>edit: Ich bin ja so blind <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /></p>
<p>C++-Standard schrieb:</p>
<blockquote>
<p>For templates greater, less, greater_equal, and less_equal, the specializations for any pointer type<br />
yield a total order, even if the built-in operators &lt;, &gt;, &lt;=, &gt;= do not.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2211369</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2211369</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 14 May 2012 12:13:01 GMT</pubDate></item><item><title><![CDATA[Reply to char* als key einer std::map on Mon, 14 May 2012 12:17:50 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Ja, echt exotisch diese 286er mit ihrem MS-DOS <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> .</p>
</blockquote>
<p>Als die Dinger modern waren, war ich ja noch nicht mal geboren. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<p>SeppJ schrieb:</p>
<blockquote>
<p>blind <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /></p>
</blockquote>
<p>Wer braucht schon mehr Smilies, wenn man die alten umfunktionieren kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2211374</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2211374</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Mon, 14 May 2012 12:17:50 GMT</pubDate></item><item><title><![CDATA[Reply to char* als key einer std::map on Mon, 14 May 2012 12:27:12 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>cooky451 schrieb:</p>
<blockquote>
<p>Müssen ja lustige Maschinen sein, bei denen das nicht klappt.</p>
</blockquote>
<p>Ja, echt exotisch diese 286er mit ihrem MS-DOS <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> .</p>
</blockquote>
<p>Mal nachdenken... man bräuchte ein Speichermodell mit far-Daten, und ein Pointervergleich dürfte nur die Offsets vergleichen und stillschweigend voraussetzen, dass die Segmentanteile gleich sind. Ergibt Sinn.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2211377</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2211377</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Mon, 14 May 2012 12:27:12 GMT</pubDate></item></channel></rss>