<?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[Dynamische Speicherallokation und Arrays]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich fange gerade neu mit C++ und Programmieren überhaupt an und kämpfe mich momentan durch ein paar Übungsaufgaben. Bei der folgenden komm ich nicht weiter.<br />
Erst mal die AUfgabenstellung:</p>
<p>********</p>
<p>Erstellen Sie eine C++-Anwendung, in der Sie dynamisch ein eindimensionales Array vom Typ short erstellen. Der Anwender Ihres Programms soll angeben können, aus wie vielen Elementen das Array bestehen soll. Legen Sie abwechselnd in alle Elemente des Arrays die Zahlen 0 und 1 hinein und geben Sie danach den Inhalt des Arrays auf den Bildschirm aus.</p>
<p>*********</p>
<p>und das folgende ist mir dazu eingefallen:</p>
<pre><code>#include &lt;iostream&gt;
using namespace std;

int main()
{

	cout &lt;&lt; &quot;Aus wie vielen Stellen soll das Array bestehen?&quot; &lt;&lt; endl;
	char anzahl[20];
	cin &gt;&gt; anzahl;
	int anz = atoi(anzahl);

	short*  aray1 = new short[anz];

	cout &lt;&lt; aray1 &lt;&lt; endl;

	for (int i=0; i&lt;anz; i++)
	{
		int z=i%2;
		short* a = &amp;aray1[i];

		if(z==0)
			*a = 0; //alternativ aray1[i] = 0; Funzt aber auch nicht
		else
			*a = 1;

	}
	delete[] aray1;

	cout &lt;&lt; aray1 &lt;&lt; endl;

	system(&quot;PAUSE&quot;);
    return EXIT_SUCCESS;	

}
</code></pre>
<p>Als Ausgabe erhalte ich immer so was wie 00356320. Unabhängig davon was ich bei cin eingebe.</p>
<p>Vielen Dank für eure Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/215465/dynamische-speicherallokation-und-arrays</link><generator>RSS for Node</generator><lastBuildDate>Mon, 12 Oct 2026 07:53:36 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/215465.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 11 Jun 2008 12:23:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Dynamische Speicherallokation und Arrays on Wed, 11 Jun 2008 12:23:18 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich fange gerade neu mit C++ und Programmieren überhaupt an und kämpfe mich momentan durch ein paar Übungsaufgaben. Bei der folgenden komm ich nicht weiter.<br />
Erst mal die AUfgabenstellung:</p>
<p>********</p>
<p>Erstellen Sie eine C++-Anwendung, in der Sie dynamisch ein eindimensionales Array vom Typ short erstellen. Der Anwender Ihres Programms soll angeben können, aus wie vielen Elementen das Array bestehen soll. Legen Sie abwechselnd in alle Elemente des Arrays die Zahlen 0 und 1 hinein und geben Sie danach den Inhalt des Arrays auf den Bildschirm aus.</p>
<p>*********</p>
<p>und das folgende ist mir dazu eingefallen:</p>
<pre><code>#include &lt;iostream&gt;
using namespace std;

int main()
{

	cout &lt;&lt; &quot;Aus wie vielen Stellen soll das Array bestehen?&quot; &lt;&lt; endl;
	char anzahl[20];
	cin &gt;&gt; anzahl;
	int anz = atoi(anzahl);

	short*  aray1 = new short[anz];

	cout &lt;&lt; aray1 &lt;&lt; endl;

	for (int i=0; i&lt;anz; i++)
	{
		int z=i%2;
		short* a = &amp;aray1[i];

		if(z==0)
			*a = 0; //alternativ aray1[i] = 0; Funzt aber auch nicht
		else
			*a = 1;

	}
	delete[] aray1;

	cout &lt;&lt; aray1 &lt;&lt; endl;

	system(&quot;PAUSE&quot;);
    return EXIT_SUCCESS;	

}
</code></pre>
<p>Als Ausgabe erhalte ich immer so was wie 00356320. Unabhängig davon was ich bei cin eingebe.</p>
<p>Vielen Dank für eure Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1526986</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1526986</guid><dc:creator><![CDATA[HaleBob]]></dc:creator><pubDate>Wed, 11 Jun 2008 12:23:18 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamische Speicherallokation und Arrays on Wed, 11 Jun 2008 12:29:21 GMT]]></title><description><![CDATA[<p>Ich sehe zwei Probleme:<br />
Du löscht aray1, bevor Du es ausgibst.<br />
Du gibst nur das Array aus (welches implizit ein Zeiger auf das erste Element interpretiert wirtd), nicht den Inhalt. Falls Du erwartest, dass C++ das automatisch macht: Das tut es nicht, Du wirst zum Ausgeben auch eine Schleife gebrauchen.</p>
<p>Davon ganz abgesehen, woher sind die Aufgaben? Aus einem Buch? Wenn ja, scheint der Autor (mal wieder) der Ansicht zu sein man müsse Anfänger unbedingt gleich mit Zeichenarrays und Zeigern konfrontieren.</p>
<p>- Benutze std::string!<br />
- Benutze std::vector!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1526998</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1526998</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Wed, 11 Jun 2008 12:29:21 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamische Speicherallokation und Arrays on Wed, 11 Jun 2008 12:34:05 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

int main()
{

	cout &lt;&lt; &quot;Aus wie vielen Stellen soll das Array bestehen?&quot; &lt;&lt; endl;
	char anzahl[20]; // besser wäre std::string
	cin &gt;&gt; anzahl;
	int anz = atoi(anzahl); // atoi() ist eine C-Funktion; Alternative: std::stringstream

    short*  aray1 = new short[anz];

	cout &lt;&lt; aray1 &lt;&lt; endl; // du gibst den Zeiger aus

	for (int i=0; i&lt;anz; i++)
	{
		aray1[i]=i%2; // Direkte Zuweisung

        // von hier ...
        //short* a = &amp;aray1[i];

		if(z==0)
			*a = 0; //alternativ aray1[i] = 0; Funzt aber auch nicht
		else
			*a = 1;
        // ... bis hier ist alles überflüssig

	}
	delete[] aray1; // hier löschst du das Array

	cout &lt;&lt; aray1 &lt;&lt; endl; // hier greifst du noch darauf zu -&gt; undefiniertes Verhalten

	system(&quot;PAUSE&quot;);
    return EXIT_SUCCESS;	// unnötig

}
</code></pre>
<p>HaleBob schrieb:</p>
<blockquote>
<p>Als Ausgabe erhalte ich immer so was wie 00356320. Unabhängig davon was ich bei cin eingebe.</p>
<p>Vielen Dank für eure Hilfe.</p>
</blockquote>
<p>Das wundert mich nicht, du gibst ja auch nicht die einzelnen Elemente Stück für Stück aus, sondern den Zeiger auf das Array. Du musst in einer Schleife die einzelnen Elemente durchgehen:</p>
<pre><code class="language-cpp">for (short i = 0; i &lt; anzahl; i++)
{
   cout &lt;&lt; aray1[i] &lt;&lt; endl;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1527000</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1527000</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 11 Jun 2008 12:34:05 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamische Speicherallokation und Arrays on Wed, 11 Jun 2008 12:37:47 GMT]]></title><description><![CDATA[<p>Weil ich gerade Langeweile habe, hier mal ein Lösungsvorschlag, der ganz ohne Zeiger auskommt. Es fehlt aber die Fehlerbehandlung nach der Eingabe der Zahlen (wo Dein Programm dafür ungeprüft mit dem Wert 0 weiterrechnen würde):</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;
using namespace std; 

int main() 
{ 
    cout &lt;&lt; &quot;Aus wie vielen Stellen soll das Array bestehen?&quot; &lt;&lt; endl; 

    int anzahl;
    cin &gt;&gt; anzahl;

    // short*  aray1 = new short[anz];
    // -&gt;
    vector&lt;short&gt; array1(anzahl, 0);

    // so nicht:
    // cout &lt;&lt; aray1 &lt;&lt; endl; 
    // -&gt;
    for (int i = 0; i &lt; array1.size(); ++i) {
        cout &lt;&lt; array1[i] &lt;&lt; endl;
    }

    for (int i = 0; i &lt; array1.size(); ++i) {
        int z = i % 2;

        // Warum die Indirektion? Geht zwar auch, auch mit vector, aber gerade bei einmaliger Anwendung reicht der direkte Zugriff vollkommen.
        // short* a = &amp;aray1[i]; 

        // Wenn, dann aber per Referenz:
        short&amp; a = array1[i];
        if (z == 0) 
            a = 0; // alternativ array1[i] = 0
        else 
            a = 1; 
    } 

    // NICHT erforderlich. Vector kümmert sich selbst um seinen Speicher
    // delete[] aray1; 

    // siehe oben
    // cout &lt;&lt; aray1 &lt;&lt; endl;

    // return am Ende von main nicht erfoderlich. Stört aber auch nicht.
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1527004</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1527004</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Wed, 11 Jun 2008 12:37:47 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamische Speicherallokation und Arrays on Wed, 11 Jun 2008 12:41:02 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<pre><code class="language-cpp">char anzahl[20]; // besser wäre std::string
	cin &gt;&gt; anzahl;
	int anz = atoi(anzahl); // atoi() ist eine C-Funktion; Alternative: std::stringstream
</code></pre>
</blockquote>
<p>...macht mich fast sprachlos, der Vorschlag<br />
Man kann (und sollte) Zahlen direkt aus der Eingabe lesen und nicht diesen umständlichen Weg über String+Umwandlung wählen - dann kommt es gar nicht darauf an, wie gut oder schlecht die Umwandlung durchgeführt wurde.</p>
<pre><code class="language-cpp">int anz = 0;
cin &gt;&gt; anz;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1527008</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1527008</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 11 Jun 2008 12:41:02 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamische Speicherallokation und Arrays on Wed, 11 Jun 2008 12:43:30 GMT]]></title><description><![CDATA[<p>So problematisch die allzu frühe Einführung dynamischer Speicherverwaltung sein mag: vector und co. lösen die Aufgabe nicht so, wie sie gestellt wurde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1527011</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1527011</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 11 Jun 2008 12:43:30 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamische Speicherallokation und Arrays on Wed, 11 Jun 2008 12:45:32 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>So problematisch die allzu frühe Einführung dynamischer Speicherverwaltung sein mag: vector und co. lösen die Aufgabe nicht so, wie sie gestellt wurde.</p>
</blockquote>
<p>Du hast recht, da habe ich zu wenig auf den Aufgabentext geachtet. Aber wenigstens kann man dem Vector einen Zeiger auf ein eindimensionales Array vom Typ short entnehmen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1527012</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1527012</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Wed, 11 Jun 2008 12:45:32 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamische Speicherallokation und Arrays on Wed, 11 Jun 2008 13:19:30 GMT]]></title><description><![CDATA[<p>WOW, das ging ja schnell. Das muss ich jetzt erst mal auseinanderpflücken.<br />
Beim ersten drüberschauen hab ich den eindruck, daß ich bei der Speicherallokation was grundsätzliches nicht kapiert habe.</p>
<blockquote>
<p>Davon ganz abgesehen, woher sind die Aufgaben? Aus einem Buch? Wenn ja, scheint der Autor (mal wieder) der Ansicht zu sein man müsse Anfänger unbedingt gleich mit Zeichenarrays und Zeigern konfrontieren.</p>
<p>- Benutze std::string!<br />
- Benutze std::vector!</p>
</blockquote>
<p>Von hier:<a href="http://www.highscore.de/cpp/einfuehrung/index.html" rel="nofollow">http://www.highscore.de/cpp/einfuehrung/index.html</a><br />
Der Autor schreibt schon ganz am Anfang, daß idR strings verwendet werden. Das hier macht er wohl...na ja...zur Übung <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>Vektoren waren auch noch nicht dran.</p>
<p>Daß aray1 ein Zeiger ist und nicht mein array war mir nicht ganz klar, das heißt also, daß ich mir die Spiecheradresse des ersten Elements anzeigen lasse??</p>
<pre><code>cout &lt;&lt; aray1 &lt;&lt; endl; // du gibst den Zeiger aus
</code></pre>
<p>Hier wollte ich nur mal sehen, was vor dem neu Beschreiben im array liegt. Das gleiche wie am Ende <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 />
Jetzt wieß ich auch warum.</p>
<p>Kann mir vielleicht mal jemand die Zeile hier zerpflücken:</p>
<pre><code>short*  aray1 = new short[anz];
</code></pre>
<p>Wird hier nur ein Zeiger definiert? Wo wird dann das array erstellt?</p>
<pre><code>aray1[i]=i%2; // Direkte Zuweisung
</code></pre>
<p>Da wäre ich in 100 Jahren nicht drauf gekommen, aber so ist das mit dem Wald und den Bäumen eben.</p>
<pre><code>int anz = 0;
cin &gt;&gt; anz;
</code></pre>
<p>Bisher wurde (im Buch) ausschließlich über cin.get() in chars eingelesen. Ich glaub das hab ich mal für int probiert, ging aber nicht. Über cin&gt;&gt; bin ich irgendwo mal gestolpert und hab es dann verwendet, wohl ohne genau zu wissen was ich da mache und daß es auch für int funktioniert, daher die Umwandlerei. Könnte mich aber auch täuschen und ich hatte einen anderen Fehler drin. Wie gesagt, bin noch ganz am Anfang.</p>
<p>Auf jeden Fall vielen Dank an alle, ich geh jetzt mal ein paar Fehler ausmerzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1527041</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1527041</guid><dc:creator><![CDATA[HaleBob]]></dc:creator><pubDate>Wed, 11 Jun 2008 13:19:30 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamische Speicherallokation und Arrays on Wed, 11 Jun 2008 13:35:13 GMT]]></title><description><![CDATA[<p>HaleBob schrieb:</p>
<blockquote>
<p>Kann mir vielleicht mal jemand die Zeile hier zerpflücken:</p>
<pre><code>short*  aray1 = new short[anz];
</code></pre>
<p>Wird hier nur ein Zeiger definiert? Wo wird dann das array erstellt?</p>
</blockquote>
<p>Man könnte das auch in zwei Zeilen schreiben:</p>
<pre><code>short*  aray1; // Deklaration des Zeigers
aray1  = new short[anz]; // Reservierung des Speichers und Zuweisung der ersten Adresse des Arrays an aray1
</code></pre>
<p>Reicht das?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1527059</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1527059</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 11 Jun 2008 13:35:13 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamische Speicherallokation und Arrays on Wed, 11 Jun 2008 13:40:31 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Nexus schrieb:</p>
<blockquote>
<pre><code class="language-cpp">char anzahl[20]; // besser wäre std::string
	cin &gt;&gt; anzahl;
	int anz = atoi(anzahl); // atoi() ist eine C-Funktion; Alternative: std::stringstream
</code></pre>
</blockquote>
<p>...macht mich fast sprachlos, der Vorschlag<br />
Man kann (und sollte) Zahlen direkt aus der Eingabe lesen und nicht diesen umständlichen Weg über String+Umwandlung wählen - dann kommt es gar nicht darauf an, wie gut oder schlecht die Umwandlung durchgeführt wurde.</p>
<pre><code class="language-cpp">int anz = 0;
cin &gt;&gt; anz;
</code></pre>
</blockquote>
<p>Und was machst du, wenn eine Fehleingabe (z.B. ein Buchstabe) vorliegt? Oder kann man das direkt über den Eingabestream <code>cin</code> überprüfen? Ich kenne mich drum nicht wirklich mit dem aus, ich benutze schon ewig keine Konsole mehr <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>HaleBob schrieb:</p>
<blockquote>
<pre><code>short*  aray1 = new short[anz];
</code></pre>
<p>Wird hier nur ein Zeiger definiert? Wo wird dann das array erstellt?</p>
</blockquote>
<p>Mit <code>new short[anz]</code> wird ein dynamisches Array erstellt. Das <code>new</code> fordert dabei Speicher auf dem Heap (dynamischer, manuell verwalteter Speicherbereich) an. Wenn du aber folgendes schreibst:</p>
<pre><code class="language-cpp">short *array1;      // Nur Deklaration und Definition; Zeiger zeigt irgendwo hin
array1 = new short[anz]; // Initialisierung: Jetzt zeigt der Zeiger auf ein Array im Heap (bzw. 1. Element)
</code></pre>
<p>Und nutze in Zukunft bitte C/C++- statt Code-Tags.</p>
<p><em>Edit: Sorry für die Wiederholung... Da hatte ich tatsächlich so lange an dem Beitrag? <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="😃"
    /></em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1527064</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1527064</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 11 Jun 2008 13:40:31 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamische Speicherallokation und Arrays on Wed, 11 Jun 2008 14:26:15 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Und was machst du, wenn eine Fehleingabe (z.B. ein Buchstabe) vorliegt? Oder kann man das direkt über den Eingabestream <code>cin</code> überprüfen? Ich kenne mich drum nicht wirklich mit dem aus, ich benutze schon ewig keine Konsole mehr <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>
</blockquote>
<pre><code class="language-cpp">int anz = 0;
std::cin &gt;&gt; anz;
if(std::cin.fail ())
{
    std::cin.clear ();
    std::cin.ignore ();
}

std::cout &lt;&lt; anz;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1527103</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1527103</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Wed, 11 Jun 2008 14:26:15 GMT</pubDate></item></channel></rss>