<?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[Dynamisches Pointerarray kopieren]]></title><description><![CDATA[<p>Hi,</p>
<p>ich möchte ein dynamisches Array komplett kopieren, d.h. mitsamt allen verwendeten Pointern.</p>
<p>Ist mein Vorgehen prinzipiell richtig? Ich habe da ein wenig Bauchschmerzen bei dem Mischen von new und memcpy.</p>
<p>Bekomme ich eigentlich irgendwie heraus, wie lang mein Array ist, wenn ich die 3 nicht wie in meinem Beispiel als Variable mitschleppe?<br />
Hab es schon mit verschiedenen sizeof's probiert, aber was verwertbares war nicht dabei. <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>
<p>Achso, Vektoren kann ich nicht verwenden, da mir auf der Zielmaschine die STL fehlt...</p>
<p>Gruß, Thomas</p>
<pre><code class="language-cpp">// Die Klasse, dessen Objekte in einer Liste gespeichert werden soll
	class Person {
	public:
		char* name;
		int alter;
	};

    // Eine Liste erstellen
    int length = 3;
	Person** liste = new Person*[length];

	liste[0] = new Person;
	liste[0]-&gt;name = &quot;John&quot;;
	liste[0]-&gt;alter = 42;
	liste[1] = new Person;
	liste[1]-&gt;name = &quot;Bob&quot;;
	liste[1]-&gt;alter = 30;
	liste[2] = new Person;
	liste[2]-&gt;name = &quot;Lucy&quot;;
	liste[2]-&gt;alter = 32;

    // Die Liste kopieren

	Person** copy = new Person*[length];
	memcpy(copy, liste, length * sizeof(class Person*));
	for (int i = 0; i &lt; length; i++) {
		copy[i] = new Person;
		memcpy(copy[i], liste[i], sizeof(class Person));
	};

    // Objekte löschen
    delete[] liste;
    delete[] copy;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/162708/dynamisches-pointerarray-kopieren</link><generator>RSS for Node</generator><lastBuildDate>Sat, 12 Sep 2026 18:18:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/162708.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 22 Oct 2006 11:31:26 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Dynamisches Pointerarray kopieren on Sun, 22 Oct 2006 11:31:26 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich möchte ein dynamisches Array komplett kopieren, d.h. mitsamt allen verwendeten Pointern.</p>
<p>Ist mein Vorgehen prinzipiell richtig? Ich habe da ein wenig Bauchschmerzen bei dem Mischen von new und memcpy.</p>
<p>Bekomme ich eigentlich irgendwie heraus, wie lang mein Array ist, wenn ich die 3 nicht wie in meinem Beispiel als Variable mitschleppe?<br />
Hab es schon mit verschiedenen sizeof's probiert, aber was verwertbares war nicht dabei. <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>
<p>Achso, Vektoren kann ich nicht verwenden, da mir auf der Zielmaschine die STL fehlt...</p>
<p>Gruß, Thomas</p>
<pre><code class="language-cpp">// Die Klasse, dessen Objekte in einer Liste gespeichert werden soll
	class Person {
	public:
		char* name;
		int alter;
	};

    // Eine Liste erstellen
    int length = 3;
	Person** liste = new Person*[length];

	liste[0] = new Person;
	liste[0]-&gt;name = &quot;John&quot;;
	liste[0]-&gt;alter = 42;
	liste[1] = new Person;
	liste[1]-&gt;name = &quot;Bob&quot;;
	liste[1]-&gt;alter = 30;
	liste[2] = new Person;
	liste[2]-&gt;name = &quot;Lucy&quot;;
	liste[2]-&gt;alter = 32;

    // Die Liste kopieren

	Person** copy = new Person*[length];
	memcpy(copy, liste, length * sizeof(class Person*));
	for (int i = 0; i &lt; length; i++) {
		copy[i] = new Person;
		memcpy(copy[i], liste[i], sizeof(class Person));
	};

    // Objekte löschen
    delete[] liste;
    delete[] copy;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1158996</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1158996</guid><dc:creator><![CDATA[Thomas++]]></dc:creator><pubDate>Sun, 22 Oct 2006 11:31:26 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamisches Pointerarray kopieren on Sun, 22 Oct 2006 11:41:27 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>nein das ist nicht korrekt. Zum einen kopierst du zuerst das ganze Array, und danach noch mal jedes Element des Arrays selbst, was doppelt gemoppelt ist. Und dann wird bei dem Member name auch nur die Adresse kopiert, nicht aber der Inhalt. Das bedeutet das sowohl Original als auch Kopie für den Member name auf denselben Speicher zeigen.</p>
<p>Das ganze kannst du dir auch einfach ersparen, indem du die Mittel des C++ Standard benutzt</p>
<pre><code class="language-cpp">#include &lt;string&gt;
#include &lt;vector&gt;

...
  class Person {
    public:
        std::string name;
        int alter;
    };
...
std::vector&lt;Person&gt; Orignal;
... // Original füllen
std::vector&lt;Person&gt; Kopie = Orignal; // komplettes Kopieren
</code></pre>
<p>Zum Umgang mit vector und string siehe die C++FAQ, das Magazin und diverse Turorials.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1159003</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1159003</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Sun, 22 Oct 2006 11:41:27 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamisches Pointerarray kopieren on Sun, 22 Oct 2006 12:32:40 GMT]]></title><description><![CDATA[<blockquote>
<p>Zum einen kopierst du zuerst das ganze Array,</p>
</blockquote>
<p>Ja, dann hab ich die erste &quot;Pointerebene&quot; abgehandelt, die Memberpointer zeigen immer noch auf die Member des Originals.</p>
<blockquote>
<p>und danach noch mal jedes Element des Arrays selbst, was doppelt gemoppelt ist.</p>
</blockquote>
<p>Ja, denn erst dann sind meine kopierten Member eigenständig.</p>
<blockquote>
<p>Und dann wird bei dem Member name auch nur die Adresse kopiert, nicht aber der Inhalt. Das bedeutet das sowohl Original als auch Kopie für den Member name auf denselben Speicher zeigen.</p>
</blockquote>
<p>Hm, bei meinen Tests konnte ich den Original-Member ändern, ohne dass sich die Kopie geändert hat. <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>
<blockquote>
<p>Das ganze kannst du dir auch einfach ersparen, indem du die Mittel des C++ Standard benutzt</p>
</blockquote>
<p>Wie gesagt, ich hab keine STL, ergo keine Vektoren oder Strings.</p>
<blockquote>
<pre><code>std::vector&lt;Person&gt; Kopie = Orignal; // komplettes Kopieren
</code></pre>
</blockquote>
<p>Hab's grad mal auf dem PC ausprobiert, das scheint mir keine echten Kopien der Daten zu liefern. <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>
<p>Gruß, Thomas</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1159028</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1159028</guid><dc:creator><![CDATA[Thomas++]]></dc:creator><pubDate>Sun, 22 Oct 2006 12:32:40 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamisches Pointerarray kopieren on Sun, 22 Oct 2006 13:29:53 GMT]]></title><description><![CDATA[<p>Hallo</p>
<blockquote>
<p>Ja, denn erst dann sind meine kopierten Member eigenständig.</p>
</blockquote>
<p>Nein, es werden die Member kopiert. Bei einem Pointer wird die Adresse kopiert, nicht aber die Instanz, die zu dieser Adresse gehört.</p>
<blockquote>
<p>Hab's grad mal auf dem PC ausprobiert, das scheint mir keine echten Kopien der Daten zu liefern</p>
</blockquote>
<p>Doch in meinem Beispiel wird alles korrekt kopiert. Woran willst du merken, das keine echte Kopie erstellt wird?</p>
<blockquote>
<p>Wie gesagt, ich hab keine STL, ergo keine Vektoren oder Strings.</p>
</blockquote>
<p>Das muß ich irgendwie überlesen haben. Wobei ich mir die Frage stelle, wieso die STl fehlen soll, wenn du doch mit new etwas aus dem C++ Standard nimmst? Das wird so auch nicht unter C laufen.</p>
<p>Wenn du also reines C erstellen willt, dann las dich ins Ansi-C Forum verschieben.<br />
Auch jedenfall must du, wenn du wirklich unabhängige Kopieen haben willst, nicht nur die Person-Instanzen selber kopieren, sondern auch das auf was die Member name verweisen.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1159072</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1159072</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Sun, 22 Oct 2006 13:29:53 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamisches Pointerarray kopieren on Tue, 24 Oct 2006 01:02:13 GMT]]></title><description><![CDATA[<p>Das memcpy ausserhalb der Schleife macht shallow-copy, und danach folgt die Schleife die deep-copy macht (wenn auch nicht vollständig &quot;deep&quot;, weil bei den strings ja bloss die pointer kopiert werden), womit das erste memcpy komplett hinfällig wird.</p>
<p>Weiters solltest du für PODs die du noch dazu mit memcpy rumkopierst zumindest des guten Stil wegens &quot;struct&quot; statt &quot;class&quot; verwenden und auf jegliche access specifier verzichten.</p>
<p>WasissnPOD: <a href="http://www.parashift.com/c++-faq-lite/intrinsic-types.html#faq-26.7" rel="nofollow">http://www.parashift.com/c++-faq-lite/intrinsic-types.html#faq-26.7</a></p>
<p>Ich bin mir auch nicht ganz sicher ob ein POD mehrere &quot;public:&quot; enthalten darf... an anderen Stellen hat ein &quot;public:&quot; zwischen 2 Member-Deklarationen nämlich durchaus nicht zu unterschätzende Auswirkungen, auch wenn ALLE Member public sind. Da aber sowieso alles public sein muss würde ich eben wie vorgeschlagen einfach struct nehmen und die &quot;public&quot; weglassen, dann bist du was das angeht auf der sicheren Seite.</p>
<p>UDTs die keine PODs sind darfst du in C++ nämlich schonmal garnicht mit memcpy kopieren. Es geht oft genug trotzdem, aber damit verlässt du dich dann halt auf undefined behaviour Dingsbumbs.</p>
<p>Und wenn am Zielsystem du keine STL hast, dann schreib dir entweder minimale Klassen für string, vector etc. selbst (müssen ja nicht so toll und vollständig wie die der STL sein), oder, besser, verwende irgendeine Lib/ein Framework welches ohne STL auskommt, auf dem Zielsystem läuft und diese einfachen Klassen zur Verfügung stellt.</p>
<p>BTW: um was für ein Zielsystem handelt es sich? Vielleicht kann dir dann ja jmd. einen Tip geben...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1160001</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1160001</guid><dc:creator><![CDATA[Plotzenhotz]]></dc:creator><pubDate>Tue, 24 Oct 2006 01:02:13 GMT</pubDate></item></channel></rss>