<?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[Speicherreservierung per Funktion nicht erlaubt?]]></title><description><![CDATA[<p>Hallo.</p>
<p>Ich versuche mal anhand einer kurzen Beschreibung mein Problem zu schildern.</p>
<p>Mein Programm startet mit einem simplen Zeiger.</p>
<p>Dieser Zeiger wird per Referenz an eine Funktion tu_etwas() übergeben.</p>
<p>In der Funktion tu_etwas() wird für den Zeiger ein 10 mal String großes Array an Speicherplatz reserviert.</p>
<p>Anschließend wird in jedes einzelne der 10 Arrayfelder das Wort &quot;Ax&quot; (x steht für eine Zahl) geschrieben.</p>
<p>Gehen wir nun zurück in die main() und versuchen das erste Arrayfeld [0] des Zeigers auszugeben, bricht das komplette Stück mit Speicherfehlern zusammen.</p>
<p>Ich kann genau so wenig in der main() die Anzahl der reservierten Felder mit sizeof() zählen.</p>
<p>Hat jemand eine Idee, wieso nicht?</p>
<p>Hier eben der Quellcode:</p>
<pre><code class="language-cpp">void tu_etwas( string *zeigerArray )
{
	zeigerArray = new string[10];

	for( int i = 0; i &lt; 10; i++ )
		zeigerArray[i] = &quot;A&quot; + i;
}

int main( void )
{
	string *zeiger = 0;

	tu_etwas( zeiger );

	cout &lt;&lt; zeiger[0];

	cin.get();

	return 0;
}
</code></pre>
<p>Lieben Gruß, paSe</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/236024/speicherreservierung-per-funktion-nicht-erlaubt</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 03:13:36 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/236024.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 09 Mar 2009 23:35:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Speicherreservierung per Funktion nicht erlaubt? on Mon, 09 Mar 2009 23:35:25 GMT]]></title><description><![CDATA[<p>Hallo.</p>
<p>Ich versuche mal anhand einer kurzen Beschreibung mein Problem zu schildern.</p>
<p>Mein Programm startet mit einem simplen Zeiger.</p>
<p>Dieser Zeiger wird per Referenz an eine Funktion tu_etwas() übergeben.</p>
<p>In der Funktion tu_etwas() wird für den Zeiger ein 10 mal String großes Array an Speicherplatz reserviert.</p>
<p>Anschließend wird in jedes einzelne der 10 Arrayfelder das Wort &quot;Ax&quot; (x steht für eine Zahl) geschrieben.</p>
<p>Gehen wir nun zurück in die main() und versuchen das erste Arrayfeld [0] des Zeigers auszugeben, bricht das komplette Stück mit Speicherfehlern zusammen.</p>
<p>Ich kann genau so wenig in der main() die Anzahl der reservierten Felder mit sizeof() zählen.</p>
<p>Hat jemand eine Idee, wieso nicht?</p>
<p>Hier eben der Quellcode:</p>
<pre><code class="language-cpp">void tu_etwas( string *zeigerArray )
{
	zeigerArray = new string[10];

	for( int i = 0; i &lt; 10; i++ )
		zeigerArray[i] = &quot;A&quot; + i;
}

int main( void )
{
	string *zeiger = 0;

	tu_etwas( zeiger );

	cout &lt;&lt; zeiger[0];

	cin.get();

	return 0;
}
</code></pre>
<p>Lieben Gruß, paSe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1677036</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1677036</guid><dc:creator><![CDATA[unlimieD.paSe]]></dc:creator><pubDate>Mon, 09 Mar 2009 23:35:25 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherreservierung per Funktion nicht erlaubt? on Mon, 09 Mar 2009 23:52:35 GMT]]></title><description><![CDATA[<p>Wenn du das willst, dann brauchst du entweder einen Pointer auf einen Pointer oder eine Referenz auf einen Pointer.</p>
<p>Es wird ja nur der lokale Pointer in der Funktion verändert, aber der Pointer im Hauptprogramm bleibt ja unverändert, denn der Pointer selbst wird per Call By Value übergeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1677039</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1677039</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 09 Mar 2009 23:52:35 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherreservierung per Funktion nicht erlaubt? on Tue, 10 Mar 2009 01:36:50 GMT]]></title><description><![CDATA[<p>sieht iwie doch bissl nach C aus - abgesehen von std::string (den namespace errate ich jz einfach mal so ^^)</p>
<pre><code class="language-cpp">void tu_etwas( string &amp;*zeigerArray ) //referenz auf den Zeiger, weil
{ 
    zeigerArray = new string[10]; //hier der Zeiger eine neue (andere) Adresse zugewiesen bekommt

    for( int i = 0; i &lt; 10; i++ )
        zeigerArray[i] = &quot;A&quot; + i; //das hier ist bestimmt nicht, was du dir vorstellst... weiß auch nicht genau, wieso das so durch den Compiler gehen sollte :P
}

int main () //void wird in C++ üblicherweise nicht in die Parameterliste geschrieben
{ 
    string *zeiger = 0; 

    tu_etwas( zeiger ); 

    cout &lt;&lt; zeiger[0]; 

    cin.get(); 

    delete[] zeiger; //!

//    return 0; unnötig
}
</code></pre>
<p>das gleiche in C++:</p>
<pre><code class="language-cpp">#include &lt;string&gt;
#include &lt;vector&gt;
#include &lt;iostream&gt;

void tu_etwas(std::vector &lt;std::string&gt; &amp;arr)
{ 
    for( char i = 0; i != 10; ++i ) //mit &quot;int&quot;, &quot;&lt;&quot; und &quot;i++&quot; wärs auch gegangen, aber dann hättest du beim '0' + i mit sicherheit ne warning bekommen
    {
        std::string toAdd = &quot;A&quot;;
        toAdd.push_back ('0' + i);
        arr.push_back (toAdd);
    }
}

int main ()
{ 
    std::vector &lt;std::string&gt; arr;

    tu_etwas( arr );

    cout &lt;&lt; arr[0] &lt;&lt; &quot;...&quot; &lt;&lt; arr[9]; //zugriffe ganz normal, wie auch bei deinem array

    cin.get(); 

//    delete[] zeiger; //brauchen wir jetzt nicht mehr - können wir also auch nicht versehentlich vergessen ^^
}
</code></pre>
<p>oder brauchtest du den pointer unbedingt?<br />
falls ja: es ist doof, in irgend ner Funktion nen new/new[] ohne delete/delete[] zu haben... also biete entweder noch ne funktion an, die das konstrukt da wieder freigibt, oder verlager das new auf außerhalb die funktion...<br />
oder aber, nimm eine klasse und schreibe dir nen entsprechenden CTor + DTor...</p>
<p>ich hoffe, du verstehst einigermaßen, was ich versucht habe, zu erklären ^^<br />
falls nicht, dann frag eben einfach nach, falls du irgendwas grundlegendes nicht verstanden hast (und sag dabei, was du denn kannst und seit wann/wie/... du C++ lernst) - wenns nur ne einzelne Funktion ist:<br />
<a href="http://www.cplusplus.com/reference/" rel="nofollow">http://www.cplusplus.com/reference/</a><br />
<a href="http://www.cppreference.com/wiki/" rel="nofollow">http://www.cppreference.com/wiki/</a><br />
auf den beiden Seiten hast du eigentlich ne wunderschöne Auflistung der STL und ne kurze Erklärung zu den Fkt und meist auch noch nen kleines Bsp. dabei...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1677049</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1677049</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Tue, 10 Mar 2009 01:36:50 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherreservierung per Funktion nicht erlaubt? on Tue, 10 Mar 2009 08:46:57 GMT]]></title><description><![CDATA[<p>Dass ich freigegebene Speicherreservierungen wieder löschen muss, damit der RAM nicht zugeschüttet wird, ist mir durchaus bewusst.</p>
<p>Falls es nicht deutlich geworden ist, möchte ich kurz betonen, dass dies ein simples Beispiel war, um Quelltext zu sparen und es bündig zu halten ohne meine restlichen zweihundert Zeilen meiner Klassenmethode zu posten, sodass jeder erst mal nachvollziehen darf, was meine Methode machen soll obwohl mein eigentliches Problem ja nur einen kurzen Ausschnitt umfasst.</p>
<p>Das ist beispielsweise auch der Grund, weshalb ich die Library Files und das Namespace weggelassen habe.</p>
<p>Vielen Dank mit der Erklärung &quot;Pointer auf Pointer&quot;.</p>
<p>Irgendwo logisch - bin leider nicht selber drauf gekommen.</p>
<p>Lieben Gruß, paSe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1677107</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1677107</guid><dc:creator><![CDATA[unlimieD.paSe]]></dc:creator><pubDate>Tue, 10 Mar 2009 08:46:57 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherreservierung per Funktion nicht erlaubt? on Tue, 10 Mar 2009 09:57:48 GMT]]></title><description><![CDATA[<p>So gern ich früher auch immer ** in Funktionen hatte, wo ich den Speicher selbst allokieren musste...</p>
<p>Heute mache ich das auch so wie unskilled das vorschlägt. Entweder den Speicher außerhalb allokieren und dann an die Funktion übergeben, oder einfach eine Referenz ( oder einen Pointer ) auf einen Vektor an die Funktion übergeben und schon gibt es keine Probleme mehr. Manches ist an C++ einfach viel schöner.</p>
<p>Früher in C... wo die Funktionen bei mir voller '*' waren.. *grusel*</p>
<p>Denn beim Zugriff auf ein solches Konstrukt in der Funktion musst du dann auch auf die '*' achten.</p>
<pre><code class="language-cpp">void tu_etwas( string **zeigerArray )
{
    zeigerArray = new string[10];

    for( int i = 0; i &lt; 10; i++ )
        (*zeigerArray)[i] = &quot;A&quot; + i;
}
</code></pre>
<p>... wenn ich mich recht entsinne... lang lang ists her <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>Ergo: Viele '*' machen den Quelltext nicht unbedingt schöner... wobei es in dem Fall gerade so noch geht <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/1677157</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1677157</guid><dc:creator><![CDATA[it0101@loggedoff]]></dc:creator><pubDate>Tue, 10 Mar 2009 09:57:48 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherreservierung per Funktion nicht erlaubt? on Tue, 10 Mar 2009 10:15:19 GMT]]></title><description><![CDATA[<p>it0101@loggedoff schrieb:</p>
<blockquote>
<p>Früher in C... wo die Funktionen bei mir voller '*' waren.. *grusel*</p>
<p>Denn beim Zugriff auf ein solches Konstrukt in der Funktion musst du dann auch auf die '*' achten.</p>
</blockquote>
<p>Also wenn du nur Angst vor Sternchen hast, übergib doch eine Referenz auf einen Pointer:</p>
<pre><code class="language-cpp">void tu_etwas( string *&amp; zeigerArray )
{
    zeigerArray = new string[10]; // in deinem Code fehlt hier übrigens ein *

    for( int i = 0; i &lt; 10; i++ )
        zeigerArray[i] = &quot;A&quot; + i;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1677158</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1677158</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Tue, 10 Mar 2009 10:15:19 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherreservierung per Funktion nicht erlaubt? on Tue, 10 Mar 2009 10:10:18 GMT]]></title><description><![CDATA[<p>oder so <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>Aber in dem Fall empfinde ich den vector&lt;T&gt; als elegantere Lösung ( und heutzutage würde ich das sogar so machen <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/1677171</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1677171</guid><dc:creator><![CDATA[it0101@loggedoff]]></dc:creator><pubDate>Tue, 10 Mar 2009 10:10:18 GMT</pubDate></item></channel></rss>