<?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[calloc &#x2F; realloc (string array)]]></title><description><![CDATA[<p>Guten Abend,</p>
<p>habe ein Problem mit der dynamischen Speicherzuweisung mittel calloc bzw. realloc. Hier ein kleines Beispiel, was das Problem verdeutlichen soll :p</p>
<pre><code class="language-cpp">#include &lt;cstdlib&gt;
#include &lt;iostream&gt;
#include &lt;string&gt;

using namespace std;

int main (void)
{
	string* strPtr = NULL;
	string str = &quot;hallo&quot;;
	strPtr = (string*) calloc(1, sizeof(string));
	strPtr[0] = str;
	strPtr = (string*) realloc(strPtr, 2 * sizeof(string));
	strPtr[1] = str;
	cout &lt;&lt; strPtr[1] &lt;&lt; endl;

	return 0;
}
</code></pre>
<p>Bis zum calloc und 'strPtr[0] = str; ' funktioniert alles super. Die realloc anweisung scheint er auch noch auszuführen. Bei der Zuweisung bekomme ich dann jedoch eine Fehlermeldung:</p>
<pre><code>Eine Ausnahme (erste Chance) bei 0x004221ac in List.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0xbaadf00d.
Unbehandelte Ausnahme bei 0x004221ac in List.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0xbaadf00d.
</code></pre>
<p>Kann mir jemand sagen, was den Fehler verursacht?<br />
Danke schon mal im Voraus.</p>
<p>PS.:Mit int, double, etc. funktioniert das super... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/244483/calloc-realloc-string-array</link><generator>RSS for Node</generator><lastBuildDate>Sat, 19 Sep 2026 10:42:15 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/244483.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 30 Jun 2009 21:41:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to calloc &#x2F; realloc (string array) on Tue, 30 Jun 2009 21:41:25 GMT]]></title><description><![CDATA[<p>Guten Abend,</p>
<p>habe ein Problem mit der dynamischen Speicherzuweisung mittel calloc bzw. realloc. Hier ein kleines Beispiel, was das Problem verdeutlichen soll :p</p>
<pre><code class="language-cpp">#include &lt;cstdlib&gt;
#include &lt;iostream&gt;
#include &lt;string&gt;

using namespace std;

int main (void)
{
	string* strPtr = NULL;
	string str = &quot;hallo&quot;;
	strPtr = (string*) calloc(1, sizeof(string));
	strPtr[0] = str;
	strPtr = (string*) realloc(strPtr, 2 * sizeof(string));
	strPtr[1] = str;
	cout &lt;&lt; strPtr[1] &lt;&lt; endl;

	return 0;
}
</code></pre>
<p>Bis zum calloc und 'strPtr[0] = str; ' funktioniert alles super. Die realloc anweisung scheint er auch noch auszuführen. Bei der Zuweisung bekomme ich dann jedoch eine Fehlermeldung:</p>
<pre><code>Eine Ausnahme (erste Chance) bei 0x004221ac in List.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0xbaadf00d.
Unbehandelte Ausnahme bei 0x004221ac in List.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0xbaadf00d.
</code></pre>
<p>Kann mir jemand sagen, was den Fehler verursacht?<br />
Danke schon mal im Voraus.</p>
<p>PS.:Mit int, double, etc. funktioniert das super... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1735292</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1735292</guid><dc:creator><![CDATA[Kronos_m]]></dc:creator><pubDate>Tue, 30 Jun 2009 21:41:25 GMT</pubDate></item><item><title><![CDATA[Reply to calloc &#x2F; realloc (string array) on Tue, 30 Jun 2009 21:43:18 GMT]]></title><description><![CDATA[<p>Du sollst in C++ nicht <code>malloc()</code> , <code>calloc()</code> , <code>realloc()</code> und <code>free()</code> verwenden (mit Ausnahmen).</p>
<p>Diese Funktionen rufen nämlich weder Konstruktor noch Destruktor auf. Benutze <code>new</code> und <code>delete</code> bzw. <code>new[]</code> und <code>delete[]</code> , wenn es nötig ist, oder arbeite gleich auf dem Stack.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1735293</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1735293</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 30 Jun 2009 21:43:18 GMT</pubDate></item><item><title><![CDATA[Reply to calloc &#x2F; realloc (string array) on Tue, 30 Jun 2009 22:06:30 GMT]]></title><description><![CDATA[<p>Danke erst mal <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":-D"
      alt="😃"
    /></p>
<p>Das ich das ganze mit<br />
<em><em>string str</em> = new string[x];</em>*<br />
lösen kann, das weiß ich ja. Es gibt aber beispielsweise keine möglichkeit eine vergrößerung vorzunehmen. Ich weiß auch wohl, dass sich das mit einer for(;;;) Schleife recht schnell lösen lässt, aber das ist nicht Sinn der Sache. Ich möchte viel mehr verstehen warum <em>realloc</em> nicht funktioniert und was ich machen kann, damit es funktioniert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1735297</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1735297</guid><dc:creator><![CDATA[Kronos_m]]></dc:creator><pubDate>Tue, 30 Jun 2009 22:06:30 GMT</pubDate></item><item><title><![CDATA[Reply to calloc &#x2F; realloc (string array) on Tue, 30 Jun 2009 22:18:01 GMT]]></title><description><![CDATA[<p><code>calloc</code> / <code>malloc</code> / <code>realloc</code> sind C-Funktionen für <a href="http://en.wikipedia.org/wiki/Plain_Old_Data_Structures" rel="nofollow">POD</a>s. <code>std::string</code> ist aber kein <a href="http://en.wikipedia.org/wiki/Plain_Old_Data_Structures" rel="nofollow">POD</a>. In C++ gibts dafür <code>new[]</code> , <code>delete[]</code> und <code>std::vector&lt;&gt;</code> . Die kommen alle auch mit nicht-<a href="http://en.wikipedia.org/wiki/Plain_Old_Data_Structures" rel="nofollow">POD</a>s klar.</p>
<p>Das Hauptproblem bei Dir ist, dass die <code>string</code> Objekte gar nicht richtig initialisiert wurden. In deinem Array steht Müll (ungültiger Zustand eines <code>string</code> -Objektes) drin. Das zweite Problem ist, dass <code>realloc</code> ggf die Daten bitweise zu einem neuen Block kopiert und den Kopier-Konstruktor und Destruktor der Klasse übergeht.</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1735298</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1735298</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Tue, 30 Jun 2009 22:18:01 GMT</pubDate></item><item><title><![CDATA[Reply to calloc &#x2F; realloc (string array) on Tue, 30 Jun 2009 22:23:43 GMT]]></title><description><![CDATA[<p>Kronos_m schrieb:</p>
<blockquote>
<p>Das ich das ganze mit<br />
<em><em>string str</em> = new string[x];</em>*<br />
lösen kann, das weiß ich ja. Es gibt aber beispielsweise keine möglichkeit eine vergrößerung vorzunehmen.</p>
</blockquote>
<p>--&gt; <code>std::vector&lt;std::string&gt;</code></p>
<p>(Es kann so einfach sein)</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1735301</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1735301</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Tue, 30 Jun 2009 22:23:43 GMT</pubDate></item><item><title><![CDATA[Reply to calloc &#x2F; realloc (string array) on Tue, 30 Jun 2009 22:33:36 GMT]]></title><description><![CDATA[<p>Kronos_m schrieb:</p>
<blockquote>
<p>Ich möchte viel mehr verstehen warum <em>realloc</em> nicht funktioniert und was ich machen kann, damit es funktioniert.</p>
</blockquote>
<p>Gar nichts. Es geht nicht. <code>realloc</code> ist unberechenbar und für non-PODs einfach nicht zu gebrauchen. Das Problem mit <code>realloc</code> ist, dass es sich die Freiheit nimmt, den alten Speicherblock freizugeben und einen neuen zu reservieren -- ohne dass man als Nutzer die Gelegenheit bekommt, die Objekte ordnungsgemäß zu kopieren/zerstören.</p>
<p>Und selbst wenn Du eine weniger freche <code>realloc</code> Funktion hättest -- eine, die vorher zurückfragt, wie die Daten denn zu kopieren sind, falls der Block nicht einfach vergrößert werden kann -- wäre es den Aufwand gegenüber std::vector einfach nicht wert. Da haben sich schon ein paar Leute die Zähne dran ausgebissen.</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1735303</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1735303</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Tue, 30 Jun 2009 22:33:36 GMT</pubDate></item><item><title><![CDATA[Reply to calloc &#x2F; realloc (string array) on Wed, 01 Jul 2009 06:32:06 GMT]]></title><description><![CDATA[<p>Gut, danke erstmal. Das mit den PODS klingt einleuchtend.<br />
Dann schreibe ich mir die Funktion zum Array vergrößern eben doch selbst. Das ist schade.</p>
<p>Sebastian Pizer schrieb:</p>
<blockquote>
<p>In deinem Array steht Müll</p>
</blockquote>
<p>Meiner Kenntnis nach steht in den Speicherstellen, die mit calloc / realloc reserviert werden Nullen. Weil die Funktionen jedes Bit der Speicherstellen auf Null setzen. Zumindest laut Referenz.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1735331</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1735331</guid><dc:creator><![CDATA[kronos_m]]></dc:creator><pubDate>Wed, 01 Jul 2009 06:32:06 GMT</pubDate></item><item><title><![CDATA[Reply to calloc &#x2F; realloc (string array) on Wed, 01 Jul 2009 06:35:22 GMT]]></title><description><![CDATA[<blockquote>
<p>Dann schreibe ich mir die Funktion zum Array vergrößern eben doch selbst. Das ist schade.</p>
</blockquote>
<p>Nimm doch, wie schon erwähnt, std::vector&lt;T&gt;!!!!<br />
Der geht für alle Typen (solange sie kopierbar sind) und wenn nötig, kannst Du mit &amp;vec[0] direkt auf den Speicher zugreifen (z.B. für C Interoperabilität).<br />
Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1735333</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1735333</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Wed, 01 Jul 2009 06:35:22 GMT</pubDate></item><item><title><![CDATA[Reply to calloc &#x2F; realloc (string array) on Wed, 01 Jul 2009 06:43:46 GMT]]></title><description><![CDATA[<p>Hi theta,</p>
<p>ich weiß doch <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":-D"
      alt="😃"
    /><br />
Habe euch wohl etwas verwirrt <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="😉"
    /> Aber zu Übungszwecken schreibe ich mir gerade meine eigene vector Klasse. Dann wäre es ja blöd, wenn ich sie benutzen würde. Über Sinn und Unsinn kann man natürlich streiten.<br />
Auf jeden Fall ist das der Grund, warum ich den speicher selber verwalten möchte <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>Setze das jetzt gerade mit new[] um!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1735336</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1735336</guid><dc:creator><![CDATA[kronos_m]]></dc:creator><pubDate>Wed, 01 Jul 2009 06:43:46 GMT</pubDate></item><item><title><![CDATA[Reply to calloc &#x2F; realloc (string array) on Wed, 01 Jul 2009 07:23:10 GMT]]></title><description><![CDATA[<p>Ok... das erklärt natülich einiges.. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1735350</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1735350</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Wed, 01 Jul 2009 07:23:10 GMT</pubDate></item><item><title><![CDATA[Reply to calloc &#x2F; realloc (string array) on Wed, 01 Jul 2009 07:47:10 GMT]]></title><description><![CDATA[<blockquote>
<p>Meiner Kenntnis nach steht in den Speicherstellen, die mit calloc / realloc reserviert werden Nullen. Weil die Funktionen jedes Bit der Speicherstellen auf Null setzen. Zumindest laut Referenz.</p>
</blockquote>
<p>nur calloc initialisiert mit 0</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1735364</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1735364</guid><dc:creator><![CDATA[fürs Protokoll]]></dc:creator><pubDate>Wed, 01 Jul 2009 07:47:10 GMT</pubDate></item><item><title><![CDATA[Reply to calloc &#x2F; realloc (string array) on Wed, 01 Jul 2009 09:07:22 GMT]]></title><description><![CDATA[<p>kronos_m schrieb:</p>
<blockquote>
<p>Sebastian Pizer schrieb:</p>
<blockquote>
<p>In deinem Array steht Müll</p>
</blockquote>
<p>Meiner Kenntnis nach steht in den Speicherstellen, die mit calloc / realloc reserviert werden Nullen. Weil die Funktionen jedes Bit der Speicherstellen auf Null setzen. Zumindest laut Referenz.</p>
</blockquote>
<p>Nullen <strong>sind</strong> Müll, wenn es um einen <code>std::string</code> geht**!** Du darfst Objekte von Non-POD-Klassen nicht manuell initialisieren, dafür gibt es Konstruktoren.</p>
<p>kronos_m schrieb:</p>
<blockquote>
<p>Setze das jetzt gerade mit new[] um!</p>
</blockquote>
<p>Ein Tipp: <code>std::vector</code> reserviert meistens für ein bisschen mehr Elemente Speicher als tatsächlich belegt werden. Wenn du das auch machst, kannst du dir in den meisten Fällen teure Reallokationen sparen, wenn du nur ein Element anhängst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1735401</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1735401</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 01 Jul 2009 09:07:22 GMT</pubDate></item></channel></rss>