<?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[struct + zeiger?]]></title><description><![CDATA[<p>Hallöchen,</p>
<p>ich hab eine Frage die allein die korrekte Speicherreservierung betrifft.<br />
Und zwar geht es um folgendes:</p>
<pre><code class="language-cpp">struct TEST
{
    char* text;
};

int main()
{
    TEST test;
    test.text = new char[6];
    test.text = &quot;Hallo&quot;;

    // mache irgendwas

    delete[] test.text;
}
</code></pre>
<p>Erzeugt einen Speicherfehler.</p>
<p>Folgendes nicht:</p>
<pre><code class="language-cpp">int main()
{
    TEST* test;
    test = new TEST;
    test-&gt;text = &quot;Hallo&quot;;

    // mache irgendwas

    delete[] test;
}
</code></pre>
<p>Mich wurmt allerdings, dass test-&gt;text nun nicht explizit Speicher zugewiesen wurde und frage mich, ob das korrekt ist.<br />
Mach ich für test-&gt;text auch noch ein new und delete so erhalte ich wieder einen Fehler.</p>
<p>Ich würd mich freuen, wenn mich jemand darüber aufklären könnte, was korrekt ist und wieso - und ob ich zwingend einen Zeiger auf meinen struct benutzen muss.</p>
<p>lg Max</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/213870/struct-zeiger</link><generator>RSS for Node</generator><lastBuildDate>Tue, 13 Oct 2026 21:53:34 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/213870.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 22 May 2008 21:39:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to struct + zeiger? on Thu, 22 May 2008 21:39:24 GMT]]></title><description><![CDATA[<p>Hallöchen,</p>
<p>ich hab eine Frage die allein die korrekte Speicherreservierung betrifft.<br />
Und zwar geht es um folgendes:</p>
<pre><code class="language-cpp">struct TEST
{
    char* text;
};

int main()
{
    TEST test;
    test.text = new char[6];
    test.text = &quot;Hallo&quot;;

    // mache irgendwas

    delete[] test.text;
}
</code></pre>
<p>Erzeugt einen Speicherfehler.</p>
<p>Folgendes nicht:</p>
<pre><code class="language-cpp">int main()
{
    TEST* test;
    test = new TEST;
    test-&gt;text = &quot;Hallo&quot;;

    // mache irgendwas

    delete[] test;
}
</code></pre>
<p>Mich wurmt allerdings, dass test-&gt;text nun nicht explizit Speicher zugewiesen wurde und frage mich, ob das korrekt ist.<br />
Mach ich für test-&gt;text auch noch ein new und delete so erhalte ich wieder einen Fehler.</p>
<p>Ich würd mich freuen, wenn mich jemand darüber aufklären könnte, was korrekt ist und wieso - und ob ich zwingend einen Zeiger auf meinen struct benutzen muss.</p>
<p>lg Max</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1514707</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1514707</guid><dc:creator><![CDATA[MaDsTyLe]]></dc:creator><pubDate>Thu, 22 May 2008 21:39:24 GMT</pubDate></item><item><title><![CDATA[Reply to struct + zeiger? on Thu, 22 May 2008 22:05:03 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Beides ist nicht korrekt. Ob du das struct nun auf dem Stack oder auf dem Heap anlegst ist dabei nicht wichtig. Denn der Zeiger text wird in beiden Fällen zweimal gesetzt : Zuerst weist du ihm eine Adresse eines manuell reserviertem Speichers zu, und danach weist du ihm die Adresse eines konstanten StringLiterals zu. Der vorher reservierte Speicher geht dabei verloren und wird <em>nicht</em> für das StringLiteral genutzt (wie du wahrscheinlich annimmst).<br />
Deshalb ist das danach folgende delete auch ungültig, String-Literale dürfen nicht gelöscht werden. Das bei den beiden Varianten einmal eine Speicherverletzung und einmal nicht angezeigt wird ist Zufall, denn nicht korrekter Code erzeugt undefiniertes Verhalten.</p>
<p>Also zwei Hinweise<br />
- benutzt strncpy um den Inhalt des String-Literals in einen anderen Speicherbereich zu kopieren. C-Strings werden nicht kopiert wenn man zwei Pointer zuweist.<br />
- benutzt lieber std::string...</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1514719</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1514719</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Thu, 22 May 2008 22:05:03 GMT</pubDate></item><item><title><![CDATA[Reply to struct + zeiger? on Thu, 22 May 2008 22:04:13 GMT]]></title><description><![CDATA[<p>Wenn ein Mod spricht sollte man hinhören <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>Hast Du einen ordentlichen Link für die Speicherverwaltung?</p>
<p>lg Max</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1514721</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1514721</guid><dc:creator><![CDATA[MaDsTyLe]]></dc:creator><pubDate>Thu, 22 May 2008 22:04:13 GMT</pubDate></item><item><title><![CDATA[Reply to struct + zeiger? on Thu, 22 May 2008 22:05:10 GMT]]></title><description><![CDATA[<p>Das erste Beispiel ist völliger Mist. <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>Du speicherst dir in der Klasse ja lediglich einen Zeiger auf char. Wenn du da jetzt aber speicher zuweist und dann nachher per = &quot;Hallo&quot; einen neuen Speicher zuweist, dann geht der Speicher verloren. Das ist bis jetzt so noch kein Problem. Das Problem kommt erst, wenn du du den Speicher freigeben willst. (Wenn du das delete auskommentierts, dann gibts auch keinen Fehler, der Memory Leak bleibt aber).<br />
Das untere Beispiel macht etwas ganz anderes. Du fordrst das Objekt test an und machst nacher das richtige mit einem Zeiger.Jedoch solltest du das mit delete freigeben und nicht mit delete[], da es ja kein Array ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1514722</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1514722</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Thu, 22 May 2008 22:05:10 GMT</pubDate></item><item><title><![CDATA[Reply to struct + zeiger? on Thu, 22 May 2008 22:09:02 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Ich war mir sicher im zweiten Beispiel auch ein</p>
<pre><code class="language-cpp">test-&gt;text = new char[6];
</code></pre>
<p>zu sehen, wurde es schon wegeditiert?</p>
<p>Tutorials zum Thema C-Strings wirst du eher im Ansi-C Forum finden, hier im C++ Forum vermeidet man rohe Speicherverwaltung lieber und benutzt std::string.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1514723</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1514723</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Thu, 22 May 2008 22:09:02 GMT</pubDate></item><item><title><![CDATA[Reply to struct + zeiger? on Thu, 22 May 2008 22:09:40 GMT]]></title><description><![CDATA[<p>akari schrieb:</p>
<blockquote>
<p>Hallo</p>
<p>Ich war mir sicher im zweiten Beispiel auch ein</p>
<pre><code class="language-cpp">test-&gt;text = new char[6];
</code></pre>
<p>zu sehen, wurde es schon wegeditiert? Aber auch ohne das sind beide nicht gültig, durch das delete auf ein String-Literal.</p>
<p>Tutorials zum Thema C-Strings wirst du eher im Ansi-C Forum finden, hier im C++ Forum vermeidet man rohe Speicherverwaltung lieber und benutzt std::string.</p>
<p>bis bald<br />
akari</p>
</blockquote>
<p>Wenn er delete test; macht, dann pasts wieder. (Er fordert ja das Objekt an und nicht den string).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1514725</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1514725</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Thu, 22 May 2008 22:09:40 GMT</pubDate></item><item><title><![CDATA[Reply to struct + zeiger? on Thu, 22 May 2008 22:11:32 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Ich merk schon wir kommen hier schon zeitlich durcheinander... bleibt gar nicht genug Zeit seine Beiträge zu korrigieren <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>So wie das zweite Beispiel jetzt dasteht hat drakon natürlich Recht.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1514727</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1514727</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Thu, 22 May 2008 22:11:32 GMT</pubDate></item><item><title><![CDATA[Reply to struct + zeiger? on Thu, 22 May 2008 22:29:55 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/7971">@akari</a>: Nein, im zweiten Beispiel ist nie ein test-&gt;text = new char[6]; gewesen.</p>
<p>Danke erstmal, d.h. also folgendes wäre korrekt:</p>
<pre><code class="language-cpp">struct TEST
{
    char* text;
};

int main()
{
    TEST* test;
    test = new TEST;
    test-&gt;text = &quot;Hallo&quot;;

    // mache irgendwas

    delete test;
}
</code></pre>
<p>Was wiederum bedeutet, dass mit &quot;new TEST&quot; auch für test-&gt;text Speicher reserviert wird? Aber wieviel ist das?</p>
<p>lg Max</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1514738</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1514738</guid><dc:creator><![CDATA[MaDsTyLe]]></dc:creator><pubDate>Thu, 22 May 2008 22:29:55 GMT</pubDate></item><item><title><![CDATA[Reply to struct + zeiger? on Thu, 22 May 2008 22:34:27 GMT]]></title><description><![CDATA[<p>In dem Fall sollte 'text' wie folgt deklariert sein:</p>
<pre><code class="language-cpp">struct TEST
{
    const char* text;
};
</code></pre>
<blockquote>
<p>Was wiederum bedeutet, dass mit &quot;new TEST&quot; auch für test-&gt;text Speicher reserviert wird? Aber wieviel ist das?</p>
</blockquote>
<p>Genau so viel wie ein Zeiger auf deinem Rechner benötigt (vermutlich 4 oder 8 Byte).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1514740</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1514740</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Thu, 22 May 2008 22:34:27 GMT</pubDate></item><item><title><![CDATA[Reply to struct + zeiger? on Thu, 22 May 2008 22:35:16 GMT]]></title><description><![CDATA[<p>Hm... wieso?</p>
<p>lg Max</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1514741</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1514741</guid><dc:creator><![CDATA[MaDsTyLe]]></dc:creator><pubDate>Thu, 22 May 2008 22:35:16 GMT</pubDate></item><item><title><![CDATA[Reply to struct + zeiger? on Thu, 22 May 2008 22:36:02 GMT]]></title><description><![CDATA[<p>für test-&gt;text wird zwar speicher reserviert, aber test-&gt;text selbst zeigt nicht auf reservierten speicher, sondern ins nirvana. erst mit <code>test-&gt;text = &quot;Hallo&quot;</code> zeigt test-&gt;text auf eine speicherstelle, auf die du zugreifen darfst (allerdings nur lesend!).</p>
<p>das beispiel, das du suchst, um zu verstehen, was man dir schreibt:</p>
<pre><code class="language-cpp">char* text = new char[6];
strncpy (text, &quot;Hallo&quot;, 6);
delete[] text;
</code></pre>
<p>dieses beispiel macht genau das, was du in deinem allerersten beispiel versuchtest du zu erreichen; nur dass es funktioniert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1514743</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1514743</guid><dc:creator><![CDATA[queer_boy]]></dc:creator><pubDate>Thu, 22 May 2008 22:36:02 GMT</pubDate></item><item><title><![CDATA[Reply to struct + zeiger? on Thu, 22 May 2008 22:42:17 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">struct TEST
{
    char* text;
};

int main()
{
    TEST* test;
    test = new TEST;
    test-&gt;text = new char[6];

    strncpy(test-&gt;text,&quot;Hallo&quot;,6);

    // mache irgendwas

    delete[] test-&gt;text;
    delete test;
}
</code></pre>
<p>Funktioniert! Danke!</p>
<p>lg Max</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1514748</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1514748</guid><dc:creator><![CDATA[MaDsTyLe]]></dc:creator><pubDate>Thu, 22 May 2008 22:42:17 GMT</pubDate></item><item><title><![CDATA[Reply to struct + zeiger? on Thu, 22 May 2008 22:48:52 GMT]]></title><description><![CDATA[<p><a href="http://magazin.c-plusplus.net/artikel/Pointer%20in%20C(PlusPlus)" rel="nofollow">http://magazin.c-plusplus.net/artikel/Pointer in C(PlusPlus)</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1514751</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1514751</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Thu, 22 May 2008 22:48:52 GMT</pubDate></item><item><title><![CDATA[Reply to struct + zeiger? on Thu, 22 May 2008 23:00:46 GMT]]></title><description><![CDATA[<p>Gibt es eigentlich einen guten Grund den ganzen Kram auf den Heap zu schaufeln?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1514761</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1514761</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Thu, 22 May 2008 23:00:46 GMT</pubDate></item><item><title><![CDATA[Reply to struct + zeiger? on Fri, 23 May 2008 11:29:35 GMT]]></title><description><![CDATA[<p>David_pb schrieb:</p>
<blockquote>
<p>Gibt es eigentlich einen guten Grund den ganzen Kram auf den Heap zu schaufeln?</p>
</blockquote>
<p>Ich denke mal, dass er das mehr als Übung gemacht hat und nicht als reeles Beispiel.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1515058</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1515058</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Fri, 23 May 2008 11:29:35 GMT</pubDate></item><item><title><![CDATA[Reply to struct + zeiger? on Fri, 23 May 2008 12:09:31 GMT]]></title><description><![CDATA[<p>Korrekt.</p>
<p>Der eigentliche Zweck soll sein eine beliebige Anzahl an structs dieser Art (d.h. mit enthaltenen Zeigern) erstellen zu können, ohne bei Nichtnutzung überflüssigen Speicherplatz reserviert zu haben.</p>
<p>lg Max</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1515101</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1515101</guid><dc:creator><![CDATA[MaDsTyLe]]></dc:creator><pubDate>Fri, 23 May 2008 12:09:31 GMT</pubDate></item></channel></rss>