<?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 Initialiserung in Funktion]]></title><description><![CDATA[<p>Hallo,<br />
ich möchte 2 Arrays in einer Funktion allokieren und mit Werten füllen, weiß aber nicht wie ich die uninitialisierte Zeiger übergeben soll.<br />
Anbei ein Beispiel mit einem Zeiger.<br />
Die Lösung mit der Rückgabe des Zeigers funktioniert leider nur mit einem Zeiger und ist damit für meinen Fall nicht anwendbar.</p>
<pre><code>void makePointer( double* pX ) { 
	pX = new double; 
	*pX = 1.; 
	cout &lt;&lt; &quot;in function: pX =&quot; &lt;&lt; *pX &lt;&lt; &quot;adress of pX =&quot; &lt;&lt; pX;
}
double* makePointer( ) { 
	double* pX = new double; 
	*pX = 2.; 
	cout &lt;&lt; &quot;in function2: pX =&quot; &lt;&lt; *pX &lt;&lt; &quot;adress of pX =&quot; &lt;&lt; pX;
	return pX;
}

main( int argc, char** argv )
{
	double* myX = 0; double* myX2 = 0;
	makePointer( myX );									// expecting getting the pointer myX actualized in function...
//	cout &lt;&lt; &quot;after call: myX =&quot; &lt;&lt; *myX &lt;&lt; &quot;adress of myX =&quot; &lt;&lt; myX;		// ...but is not so! generates memory exception (Null pointer)	
	myX2 = makePointer();								// works as expected
	cout &lt;&lt; &quot;after call: myX2 =&quot; &lt;&lt; *myX2 &lt;&lt; &quot;adress of myX2 =&quot; &lt;&lt; myX2;
}
</code></pre>
<p>Ich hatte erwartet, daß der übergebene Zeiger myX im ersten Fall bei der Speicher Allokierung aktualisiert werden würde, dies ist jedoch nur innerhalb der Funktion der Fall, nach dem Rücksprung hat myX wieder den alten Wert 0.<br />
Hat jemand eine Idee wie ich mein Vorhaben realisieren kann?</p>
<p>Danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/320506/zeiger-initialiserung-in-funktion</link><generator>RSS for Node</generator><lastBuildDate>Fri, 24 Jul 2026 02:40:31 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/320506.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 30 Sep 2013 15:22:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zeiger Initialiserung in Funktion on Mon, 30 Sep 2013 15:22:18 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich möchte 2 Arrays in einer Funktion allokieren und mit Werten füllen, weiß aber nicht wie ich die uninitialisierte Zeiger übergeben soll.<br />
Anbei ein Beispiel mit einem Zeiger.<br />
Die Lösung mit der Rückgabe des Zeigers funktioniert leider nur mit einem Zeiger und ist damit für meinen Fall nicht anwendbar.</p>
<pre><code>void makePointer( double* pX ) { 
	pX = new double; 
	*pX = 1.; 
	cout &lt;&lt; &quot;in function: pX =&quot; &lt;&lt; *pX &lt;&lt; &quot;adress of pX =&quot; &lt;&lt; pX;
}
double* makePointer( ) { 
	double* pX = new double; 
	*pX = 2.; 
	cout &lt;&lt; &quot;in function2: pX =&quot; &lt;&lt; *pX &lt;&lt; &quot;adress of pX =&quot; &lt;&lt; pX;
	return pX;
}

main( int argc, char** argv )
{
	double* myX = 0; double* myX2 = 0;
	makePointer( myX );									// expecting getting the pointer myX actualized in function...
//	cout &lt;&lt; &quot;after call: myX =&quot; &lt;&lt; *myX &lt;&lt; &quot;adress of myX =&quot; &lt;&lt; myX;		// ...but is not so! generates memory exception (Null pointer)	
	myX2 = makePointer();								// works as expected
	cout &lt;&lt; &quot;after call: myX2 =&quot; &lt;&lt; *myX2 &lt;&lt; &quot;adress of myX2 =&quot; &lt;&lt; myX2;
}
</code></pre>
<p>Ich hatte erwartet, daß der übergebene Zeiger myX im ersten Fall bei der Speicher Allokierung aktualisiert werden würde, dies ist jedoch nur innerhalb der Funktion der Fall, nach dem Rücksprung hat myX wieder den alten Wert 0.<br />
Hat jemand eine Idee wie ich mein Vorhaben realisieren kann?</p>
<p>Danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2356810</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2356810</guid><dc:creator><![CDATA[alainstgt]]></dc:creator><pubDate>Mon, 30 Sep 2013 15:22:18 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger Initialiserung in Funktion on Mon, 30 Sep 2013 15:25:25 GMT]]></title><description><![CDATA[<pre><code>void makePointer( double** pX ) { 
	*pX = new double; 
	**pX = 1.; 
	cout &lt;&lt; &quot;in function: *pX =&quot; &lt;&lt; **pX &lt;&lt; &quot;adress of pX =&quot; &lt;&lt; pX;
}

main( int argc, char** argv )
{
	double* myX = 0; double* myX2 = 0;
	makePointer( &amp;myX
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2356812</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2356812</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 30 Sep 2013 15:25:25 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger Initialiserung in Funktion on Mon, 30 Sep 2013 15:30:19 GMT]]></title><description><![CDATA[<p>Das sieht mir sehr nach C aus. Da macht man so etwas meist mit Pointer auf Ponter. Warum nimmst du keinen vector?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2356813</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2356813</guid><dc:creator><![CDATA[TNA]]></dc:creator><pubDate>Mon, 30 Sep 2013 15:30:19 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger Initialiserung in Funktion on Mon, 30 Sep 2013 15:36:59 GMT]]></title><description><![CDATA[<blockquote>
<p>Ich hatte erwartet, daß der übergebene Zeiger myX im ersten Fall bei der Speicher Allokierung aktualisiert werden würde, dies ist jedoch nur innerhalb der Funktion der Fall, nach dem Rücksprung hat myX wieder den alten Wert 0.</p>
</blockquote>
<p>Innerhalb der Funktion wird auch nicht myX verwendet, sondern der Funktionsparameter. Falls myX verändert werden sollte, hätte der Funktionsparameter eine Referenz sein sollen (oder sowie in Volkards Beispiel...).</p>
<p>Ich verstehe allerdings nicht, warum du nicht einfach Variante zwei nimmst. Die ist sowieso sinnvoller im Bezug auf die Syntax beim Aufruf (in C++ erwartet man nicht immer, dass Funktionsargumente verändert werden).</p>
<pre><code>p = makePointer(); // intuitiv klar
makePointer(p); // Muss erst Funktionssignatur nachschlagen
</code></pre>
<blockquote>
<p>Warum nimmst du keinen vector?</p>
</blockquote>
<p>Weil er hier nichts verloren hat? Ich sehe keine Arrays, du etwa?</p>
<p>In diesem speziellen Beispiel sehe ich auch keine Gründe für dynamisch allokierte Skalare. <strong>Wofür brauchst du das genau?</strong> Und wenn du aus irgendeinem (hoffentich guten) Grund tatsächlich dynamisch allokieren musst, setze dich auf jeden Fall demnächst mit Smart-Pointern auseinander. Schon in deinem primitiven Beispiel oben ist Speicher nicht freigegeben worden. Das ist, mit anderen Worten, ein klassisches Speicherleck. Das verhindern ebenjene smarten Zeiger.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2356815</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2356815</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Mon, 30 Sep 2013 15:36:59 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger Initialiserung in Funktion on Mon, 30 Sep 2013 15:34:10 GMT]]></title><description><![CDATA[<p>Der Zeiger muss per Referenz oder Pointer uebergeben werden und nicht per value. Desweiteren wird nirgends der angeforderte Speicher wieder freigegen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2356816</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2356816</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 30 Sep 2013 15:34:10 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger Initialiserung in Funktion on Mon, 30 Sep 2013 15:34:39 GMT]]></title><description><![CDATA[<p>Du machst call-by-value. Wenn du mit dem Original machen willst, musst du natürlich call-by-reference machen.</p>
<p>Ich hoffe, du machst das nur zu Übungszwecken. In echt wirst du so etwas in C++ nie verwende. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2356817</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2356817</guid><dc:creator><![CDATA[out]]></dc:creator><pubDate>Mon, 30 Sep 2013 15:34:39 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger Initialiserung in Funktion on Mon, 30 Sep 2013 15:45:43 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<blockquote>
<p>Warum nimmst du keinen vector?</p>
</blockquote>
<p>Weil er hier nichts verloren hat? Ich sehe keine Arrays, du etwa?</p>
</blockquote>
<p>Im Text schrieb er etwas von 2 Arrays die er allokieren möchte. Ich hatte den Code jetzt für ein vereinfachtes Beispiel gehalten. Wozu allokiert man denn ein einzelnes Double?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2356820</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2356820</guid><dc:creator><![CDATA[TNA]]></dc:creator><pubDate>Mon, 30 Sep 2013 15:45:43 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger Initialiserung in Funktion on Mon, 30 Sep 2013 15:54:54 GMT]]></title><description><![CDATA[<p>TNA schrieb:</p>
<blockquote>
<p>Im Text schrieb er etwas von 2 Arrays die er allokieren möchte. Ich hatte den Code jetzt für ein vereinfachtes Beispiel gehalten.</p>
</blockquote>
<p>Pardon, du hast Recht. Ich hatte das sogar gelesen und vergessen.</p>
<blockquote>
<p>Wozu allokiert man denn ein einzelnes Double?</p>
</blockquote>
<p>Stimmt. Das hat eigentlich praktisch keinen Zweck.</p>
<p>Jetzt will ich aber kein Beispiel posten, weil ich dann Gefahr laufe, ausgeschimpft zu werden, dass er das noch nicht &quot;hatte&quot; und ihm das zu viel sei.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2356823</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2356823</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Mon, 30 Sep 2013 15:54:54 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger Initialiserung in Funktion on Mon, 30 Sep 2013 17:52:06 GMT]]></title><description><![CDATA[<p>danke volkard. Jetzt ist es mir klar, daß ich einen Zeiger auf einen Zeiger nehmen muß (**argv läßt grüßen!).</p>
<p>Ich schreibe einen C++ Wrapper für eine C-Bibliothek, also Mischtechnik.<br />
Ich hatte an einen Vektor gedacht, diese Funktion ist jedoch eine Utility-Funktion, die auch von C-Routinen aufgerufen werden kann.</p>
<p>Dachte nicht daß ich so eine Lawine austreten würde... Danke an Alle für die Rege Duskussion.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2356877</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2356877</guid><dc:creator><![CDATA[alainstgt]]></dc:creator><pubDate>Mon, 30 Sep 2013 17:52:06 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger Initialiserung in Funktion on Mon, 30 Sep 2013 18:46:45 GMT]]></title><description><![CDATA[<p>alainstgt schrieb:</p>
<blockquote>
<p>danke volkard. Jetzt ist es mir klar, daß ich einen Zeiger auf einen Zeiger nehmen muß (**argv läßt grüßen!).</p>
</blockquote>
<p>Genau das wollte ich haben. <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="👍"
    /><br />
Wie Du den ** dann umgehen kannst, kommt danach, aber erstmal muss in der Basis Klarheit sein. Eine *&amp; wäre wohl üblich. Läßt sich aber viel besser verstehen aus Sicht des **, finde ich.</p>
<p>~Bin ein wenig enttäuscht über die Welle.~</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2356897</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2356897</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 30 Sep 2013 18:46:45 GMT</pubDate></item></channel></rss>