<?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[Variablengültigkeit]]></title><description><![CDATA[<p>Hallo!</p>
<p>In C/C++ gibt es ja anscheinend 2 möglichkeiten einer variablen zu erstellen.</p>
<p>a) &quot;automatisch&quot;</p>
<pre><code>int a;
</code></pre>
<p>b) &quot;manuell&quot;</p>
<pre><code>int *a = new int;
</code></pre>
<p>Nun ist bei b) klar wann der Speicher wieder freigegeben wird: erst bei</p>
<pre><code>delete a;
</code></pre>
<p>... sonst haben wir ein Speicherleck.</p>
<p>Nun aber a)!<br />
Beispiel:</p>
<pre><code>char *stringfunction()
{
  char *string = &quot;Test&quot;; // equivalent zu char string[5] = &quot;Test&quot;; oder einer Einzelzuweisung
return string;
}

int *intfunction()
{
  int i = 1;
  return &amp;i;
}

void main()
{
  char *stringtest;
  stringtest = stringfunction(); // FEHLER? ist der speicherbereich nicht schon freigeben?

  int *inttest;
  inttest = infunction(); // FEHLER? ist der speicher nicht schon freigegeben?
}
</code></pre>
<p>Allgemein lautet die Frage: WANN werden a) Variablen wieder freigegeben?<br />
Am Ende eines Blocks oder? Das würde bedeuten, dass die Beispiele schief laufen. Stimmt das?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/125643/variablengültigkeit</link><generator>RSS for Node</generator><lastBuildDate>Mon, 24 Aug 2026 09:44:59 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/125643.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 08 Nov 2005 10:44:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Variablengültigkeit on Tue, 08 Nov 2005 10:44:41 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>In C/C++ gibt es ja anscheinend 2 möglichkeiten einer variablen zu erstellen.</p>
<p>a) &quot;automatisch&quot;</p>
<pre><code>int a;
</code></pre>
<p>b) &quot;manuell&quot;</p>
<pre><code>int *a = new int;
</code></pre>
<p>Nun ist bei b) klar wann der Speicher wieder freigegeben wird: erst bei</p>
<pre><code>delete a;
</code></pre>
<p>... sonst haben wir ein Speicherleck.</p>
<p>Nun aber a)!<br />
Beispiel:</p>
<pre><code>char *stringfunction()
{
  char *string = &quot;Test&quot;; // equivalent zu char string[5] = &quot;Test&quot;; oder einer Einzelzuweisung
return string;
}

int *intfunction()
{
  int i = 1;
  return &amp;i;
}

void main()
{
  char *stringtest;
  stringtest = stringfunction(); // FEHLER? ist der speicherbereich nicht schon freigeben?

  int *inttest;
  inttest = infunction(); // FEHLER? ist der speicher nicht schon freigegeben?
}
</code></pre>
<p>Allgemein lautet die Frage: WANN werden a) Variablen wieder freigegeben?<br />
Am Ende eines Blocks oder? Das würde bedeuten, dass die Beispiele schief laufen. Stimmt das?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/911612</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/911612</guid><dc:creator><![CDATA[adsci]]></dc:creator><pubDate>Tue, 08 Nov 2005 10:44:41 GMT</pubDate></item><item><title><![CDATA[Reply to Variablengültigkeit on Tue, 08 Nov 2005 10:50:37 GMT]]></title><description><![CDATA[<p>Ja, die Variable wird in dem Moment freigegeben, wo ihr Block verlassen wird - außer du definierst sie als statische Variable:</p>
<pre><code class="language-cpp">static int i;//bleibt gültig bis zum Programmende
</code></pre>
<p>(und es ist generell keine gute Idee, die Adresse einer lokal definierten Variablen nach außen zu übergeben)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/911619</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/911619</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 08 Nov 2005 10:50:37 GMT</pubDate></item><item><title><![CDATA[Reply to Variablengültigkeit on Tue, 08 Nov 2005 10:56:25 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Ja, die Variable wird in dem Moment freigegeben, wo ihr Block verlassen wird - außer du definierst sie als statische Variable:</p>
<pre><code class="language-cpp">static int i;//bleibt gültig bis zum Programmende
</code></pre>
<p>(und es ist generell keine gute Idee, die Adresse einer lokal definierten Variablen nach außen zu übergeben)</p>
</blockquote>
<p>okay, danke!<br />
wie schreibt man dann aber eine funktion die einen String zurückgeben soll?<br />
Sagen wir den festen String &quot;Test&quot;?<br />
Das mit static wäre ja ätzend. Will ja nicht nen haufen Variablenleichen im Keller haben, wenn die Funktion mehrmals aufgerufen wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/911628</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/911628</guid><dc:creator><![CDATA[adsci]]></dc:creator><pubDate>Tue, 08 Nov 2005 10:56:25 GMT</pubDate></item><item><title><![CDATA[Reply to Variablengültigkeit on Tue, 08 Nov 2005 11:08:28 GMT]]></title><description><![CDATA[<p>mit static hast du nur eine &quot;Version&quot; der Variablen - die wird jedes Mal wiederverwendet, wenn du die Funktion neu aufrufst.</p>
<p>(und um Strings zu übergeben, empfehle ich std::string)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/911641</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/911641</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 08 Nov 2005 11:08:28 GMT</pubDate></item><item><title><![CDATA[Reply to Variablengültigkeit on Tue, 08 Nov 2005 11:13:35 GMT]]></title><description><![CDATA[<p>IMHO sollte das erste Beispiel (char*) sogar korrekt laufen, da hier nicht die Adresse des charpointers auf dem Stack sondern die Adresse des konstanten Strings &quot;Test&quot; (welcher im Data-Segment liegen müsste) zurückgegeben wird.</p>
<p>Also:</p>
<pre><code class="language-cpp">char *string = &quot;Test&quot;; // &quot;string&quot; sind 4 Byte Zeiger auf dem Stack.
                       // &quot;string&quot; enthält Adr. von konstantem String &quot;Test&quot;
return string;         // Eben jene Adr. wird zurückgegeben und die 4 Byte 
                       // der Variable &quot;string&quot; freigegeben
</code></pre>
<p>Oder?!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/911644</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/911644</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 08 Nov 2005 11:13:35 GMT</pubDate></item><item><title><![CDATA[Reply to Variablengültigkeit on Tue, 08 Nov 2005 11:14:32 GMT]]></title><description><![CDATA[<p>danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/911646</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/911646</guid><dc:creator><![CDATA[adsci]]></dc:creator><pubDate>Tue, 08 Nov 2005 11:14:32 GMT</pubDate></item><item><title><![CDATA[Reply to Variablengültigkeit on Tue, 08 Nov 2005 11:18:03 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>IMHO sollte das erste Beispiel (char*) sogar korrekt laufen, da hier nicht die Adresse des charpointers auf dem Stack sondern die Adresse des konstanten Strings &quot;Test&quot; (welcher im Data-Segment liegen müsste) zurückgegeben wird.</p>
<p>Also:</p>
<pre><code class="language-cpp">char *string = &quot;Test&quot;; // &quot;string&quot; sind 4 Byte Zeiger auf dem Stack.
                       // &quot;string&quot; enthält Adr. von konstantem String &quot;Test&quot;
return string;         // Eben jene Adr. wird zurückgegeben und die 4 Byte 
                       // der Variable &quot;string&quot; freigegeben
</code></pre>
<p>Oder?!</p>
</blockquote>
<p>ich denke, das genau ist mein problem. ich glaube aber das es nicht funktioniert.</p>
<pre><code>char *string = &quot;Test&quot;
</code></pre>
<p>ist ja nur eine Abkürzung für</p>
<pre><code>char string[5];
string[0] = 'T';
string[1] = 'e';
string[2] = 's';
string[3] = 't';
string[4] = 0;
</code></pre>
<p>und der bereich wird dann wieder am Ende der Funktion freigegeben, nicht? ein Array muss man ja nicht wieder mit delte freigeben!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/911650</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/911650</guid><dc:creator><![CDATA[adsci]]></dc:creator><pubDate>Tue, 08 Nov 2005 11:18:03 GMT</pubDate></item><item><title><![CDATA[Reply to Variablengültigkeit on Tue, 08 Nov 2005 11:26:22 GMT]]></title><description><![CDATA[<p>Nein, das ist nicht das selbe - das Literal wird in dem Fall im Datensegment gelagert und string bekommt die Adresse dieses Bereichs zugewiesen (die Abkürzung für die Initialisierung wäre char &quot;string[]=&quot;Test&quot;;&quot;).</p>
<p>Wie gesagt, auf der sicheren Seite bist du wirklich nur mit new (aber dann das delete nicht vergessen) oder std::string:</p>
<pre><code class="language-cpp">string stringfunction()
{
  string data=&quot;Test&quot;;
  return data;//hier werden die Zeichendaten evt. kopiert
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/911652</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/911652</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 08 Nov 2005 11:26:22 GMT</pubDate></item><item><title><![CDATA[Reply to Variablengültigkeit on Tue, 08 Nov 2005 11:37:48 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Nein, das ist nicht das selbe - das Literal wird in dem Fall im Datensegment gelagert und string bekommt die Adresse dieses Bereichs zugewiesen (die Abkürzung für die Initialisierung wäre char &quot;string[]=&quot;Test&quot;;&quot;).</p>
<p>Wie gesagt, auf der sicheren Seite bist du wirklich nur mit new (aber dann das delete nicht vergessen) oder std::string:</p>
<pre><code class="language-cpp">string stringfunction()
{
  string data=&quot;Test&quot;;
  return data;//hier werden die Zeichendaten evt. kopiert
}
</code></pre>
</blockquote>
<p>okay! also werden normale arrays auf dem stack angelegt?<br />
was meinst du mit &quot;evtl. kopiert&quot;?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/911666</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/911666</guid><dc:creator><![CDATA[adsci]]></dc:creator><pubDate>Tue, 08 Nov 2005 11:37:48 GMT</pubDate></item><item><title><![CDATA[Reply to Variablengültigkeit on Tue, 08 Nov 2005 11:54:20 GMT]]></title><description><![CDATA[<p>lokale Variablen kommen grundsätzlich auf den Stack. Alles was mit new angelegt wird auf den Heap.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/911689</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/911689</guid><dc:creator><![CDATA[Pellaeon]]></dc:creator><pubDate>Tue, 08 Nov 2005 11:54:20 GMT</pubDate></item><item><title><![CDATA[Reply to Variablengültigkeit on Tue, 08 Nov 2005 12:03:37 GMT]]></title><description><![CDATA[<p>adsci schrieb:</p>
<blockquote>
<p>was meinst du mit &quot;evtl. kopiert&quot;?</p>
</blockquote>
<p>std::string verwaltet die Zeichen auf dem Heap und kümmert sich selber um die new/delete Angelegenheiten. Da hängt es von der Implementierung ab, ob bei &quot;return data;&quot; nur der Zeiger auf die exisiterenden Daten übergeben wird oder ein neuer Bereich mit einer Kopie angelegt wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/911697</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/911697</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 08 Nov 2005 12:03:37 GMT</pubDate></item><item><title><![CDATA[Reply to Variablengültigkeit on Tue, 08 Nov 2005 12:20:16 GMT]]></title><description><![CDATA[<p>na, da muss ich das letztere erhoffen...</p>
<p>danke, in jedem fall! hast mir weitergeholfen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/911716</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/911716</guid><dc:creator><![CDATA[adsci]]></dc:creator><pubDate>Tue, 08 Nov 2005 12:20:16 GMT</pubDate></item><item><title><![CDATA[Reply to Variablengültigkeit on Tue, 08 Nov 2005 20:28:24 GMT]]></title><description><![CDATA[<p>adsci schrieb:</p>
<blockquote>
<p>na, da muss ich das letztere erhoffen...</p>
</blockquote>
<p>Nö, erhoffen musst du gar nichts. Wenn std::string hier nur ein simples return macht, weil es zB mit COW Semantik implementiert ist, dann kann dir das auch egal sein. Das ist ja auch das schöne an solchen Containern. Ihre Funktionalität ist immer gleich, egal wie sie implementiert sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/912211</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/912211</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Tue, 08 Nov 2005 20:28:24 GMT</pubDate></item><item><title><![CDATA[Reply to Variablengültigkeit on Wed, 09 Nov 2005 09:18:10 GMT]]></title><description><![CDATA[<p>adsci schrieb:</p>
<blockquote>
<pre><code>char *string = &quot;Test&quot;
</code></pre>
</blockquote>
<p>Nur so zur Info, diese Konvertierung (von const char[] nach char*) ist veraltet und sollte nicht mehr verwendet werden (reines Kompatibilitätsfeature zu C). Sie wird auch öfters liebevoll als &quot;Conversion of Death&quot; bezeichnet, da ein Zeiger auf ein Literal plötzlich schreibbar gemacht wird. Da das Literal 'ROMable' ist, liegt es wahrscheinlich nicht im Datensegment, sondern wird eher vom Loader in einen schreibgeschützten Bereich geschoben. Im besten Falle stürzt das Programm bei einem Schreibzugriff ab. Falls der Schreibzugriff gelingen sollte, ändert man vielleicht gleich andere Literale mit, da diese überlagert gespeichert werden dürfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/912503</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/912503</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Wed, 09 Nov 2005 09:18:10 GMT</pubDate></item></channel></rss>