<?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[Zeiger und Gültigkeit]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe folgende struct:</p>
<pre><code class="language-cpp">struct AllocInfo {
	const char*			desc;

	AllocInfo (const char* _desc) : 
		desc(_desc) { }
};
</code></pre>
<p>Jetzt frage ich mich, wie ich hier Strings übergeben darf. Ich mache ja kein strcpy(), dh desc zeigt einfach nur auf den übergebenen Pointer.</p>
<pre><code class="language-cpp">// Fall 1
AllocInfo a1(&quot;foo&quot;); // Ist das ok? Nach der Zeile zeigt a1.desc wohin?

//Fall 2
{
  char* s = &quot;hallo&quot;;
  AllocInfo a2(s);   // Ist das ok? Wenn s den Scope verlässt, wird es ja zerstört. Worauf zeit dann a2.desc?
}
</code></pre>
<p>Fragen stehen im Code. Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/289870/zeiger-und-gültigkeit</link><generator>RSS for Node</generator><lastBuildDate>Tue, 18 Aug 2026 21:58:23 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/289870.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 14 Jul 2011 13:29:31 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zeiger und Gültigkeit on Thu, 14 Jul 2011 13:29:31 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe folgende struct:</p>
<pre><code class="language-cpp">struct AllocInfo {
	const char*			desc;

	AllocInfo (const char* _desc) : 
		desc(_desc) { }
};
</code></pre>
<p>Jetzt frage ich mich, wie ich hier Strings übergeben darf. Ich mache ja kein strcpy(), dh desc zeigt einfach nur auf den übergebenen Pointer.</p>
<pre><code class="language-cpp">// Fall 1
AllocInfo a1(&quot;foo&quot;); // Ist das ok? Nach der Zeile zeigt a1.desc wohin?

//Fall 2
{
  char* s = &quot;hallo&quot;;
  AllocInfo a2(s);   // Ist das ok? Wenn s den Scope verlässt, wird es ja zerstört. Worauf zeit dann a2.desc?
}
</code></pre>
<p>Fragen stehen im Code. Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2092750</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2092750</guid><dc:creator><![CDATA[Zeigerfrager]]></dc:creator><pubDate>Thu, 14 Jul 2011 13:29:31 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger und Gültigkeit on Thu, 14 Jul 2011 13:55:09 GMT]]></title><description><![CDATA[<p>Stringliterale haben statische Speicherdauer. Beide Beispielprogramme sind äquivalent (wahrscheinlich sogar der gleiche Code).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2092752</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2092752</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Thu, 14 Jul 2011 13:55:09 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger und Gültigkeit on Thu, 14 Jul 2011 13:40:39 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">//Fall 2
{
  char* s = &quot;hallo&quot;;
  AllocInfo a2(s);   // Ist das ok? Wenn s den Scope verlässt, wird es ja zerstört. Worauf zeit dann a2.desc?
}
</code></pre>
<p>Die Befürchtung ist hier unberechtigt, denn s zeigt wie Bashar es beschrieb, auf das unsterbliche Stringliteral.</p>
<p>Was gaanz anderes ist</p>
<pre><code class="language-cpp">//Fall 3
{
  char s[] = &quot;hallo&quot;; // s ist lokaler Speicher, in den gerade &quot;hallo&quot; kopiert wurde
  AllocInfo a2(s);   // Ist das ok? Wenn s den Scope verlässt, wird es ja zerstört. Worauf zeit dann a2.desc?
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2092756</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2092756</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 14 Jul 2011 13:40:39 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger und Gültigkeit on Thu, 14 Jul 2011 13:48:19 GMT]]></title><description><![CDATA[<p>Aber hier auch kein Problem, weil a2 keine längere Lebensdauer als s[] hat.<br />
Wenn man da aber einen setter hätte auf ein Objekt, dass ausserhalb lebt, dann hat man ein Problem.</p>
<pre><code class="language-cpp">//Fall 4
AllocInfo a2(&quot;blubb&quot;);
{
  char s[] = &quot;hallo&quot;; // s ist lokaler Speicher, in den gerade &quot;hallo&quot; kopiert wurde
  a2.set(s);   // Ist das ok? Wenn s den Scope verlässt, wird es ja zerstört. Worauf zeit dann a2.desc?
}
// das, worauf s zugewiesen wurde ist jetzt auch nicht mehr gültig.
</code></pre>
<p>Der Unterschied liegt jetzt darin, dass das Beispiel hier mit dem s aus Fall 2 ok wäre, weil wie Bashar bereits vermerkt hat Stringliterale statische Lebensdauer haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2092757</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2092757</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Thu, 14 Jul 2011 13:48:19 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger und Gültigkeit on Thu, 14 Jul 2011 14:06:34 GMT]]></title><description><![CDATA[<p>Ok, danke.</p>
<p>Ich glaube dann habe ich in meinem Fall ein Problem</p>
<p>Bei mir sieht es in etwa so aus:</p>
<pre><code class="language-cpp">void MemManager::createAllocInfo(void* p, size_t size, const char* desc) {
  mAllocMap[p] = AllocInfo(desc);
}

// Aufruf irgendwo:
{
  char c[200];
  sprintf_s(c, &quot;object %i\n&quot;, id);
  memManager.createAllocInfo(p, size, c);
...
}
</code></pre>
<p>Dh. ich baue den String lokal zusammen und übergebe ihn dann. Das ist jetzt problamtisch, weil c zerstört wird und es ja kein &quot;statischer, globaler string ist&quot; und deswegen der Zeiger in allocInfo auf ungültigen Speicher zeigt, oder?</p>
<p>Das kann ich eigentlich nur lösen mit einem strcpy() in AllocInfo(), oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2092765</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2092765</guid><dc:creator><![CDATA[Zeigerfrager]]></dc:creator><pubDate>Thu, 14 Jul 2011 14:06:34 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger und Gültigkeit on Thu, 14 Jul 2011 14:14:34 GMT]]></title><description><![CDATA[<p>Genau. Oder du benutzt die C++ String Klasse std::string. Die macht das nämlich für dich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2092770</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2092770</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Thu, 14 Jul 2011 14:14:34 GMT</pubDate></item></channel></rss>