<?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[Zu wenig Speicher für Zeiger Allokieren ?!]]></title><description><![CDATA[<p>moin, ich bin im moment total verwirrt was die Speicherallokierung angeht. Zunächst einmal hab ich diesen Quellcode:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;stdlib.h&gt;

using namespace std;
int main()
{
	cout &lt;&lt; sizeof(unsigned long)&lt;&lt;endl;
	unsigned long* zeiger;
	zeiger = (unsigned long*) malloc(2);
	*zeiger=4294967290;
	cout &lt;&lt; *zeiger&lt;&lt;endl;
}
</code></pre>
<p>Ich verstehe einfach nicht, warum der Code Fehlerlos ausgeführt wird. unsigned long benötigt doch 4 Byte, und ich habe doch mit malloc bloß 2 allokiert, also was passiert denn da?</p>
<p>Und dann hätte ich gleich noch eine andere Frage. Wenn ich mehr Speicher allokiere als die Struktur des Zeigers benötigt, was ist dann mit dem Restlichen Speicher? Und kann ich dann auf den noch irgendwie zugreifen?<br />
Wäre auch sehr dankbar für Hinweise auf links ect. wo etwas zum Thema Speicherallokierung steht.<br />
Thx, MfG homie</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/186263/zu-wenig-speicher-für-zeiger-allokieren</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 10:26:52 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/186263.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 06 Jul 2007 15:09:03 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zu wenig Speicher für Zeiger Allokieren ?! on Fri, 06 Jul 2007 15:09:03 GMT]]></title><description><![CDATA[<p>moin, ich bin im moment total verwirrt was die Speicherallokierung angeht. Zunächst einmal hab ich diesen Quellcode:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;stdlib.h&gt;

using namespace std;
int main()
{
	cout &lt;&lt; sizeof(unsigned long)&lt;&lt;endl;
	unsigned long* zeiger;
	zeiger = (unsigned long*) malloc(2);
	*zeiger=4294967290;
	cout &lt;&lt; *zeiger&lt;&lt;endl;
}
</code></pre>
<p>Ich verstehe einfach nicht, warum der Code Fehlerlos ausgeführt wird. unsigned long benötigt doch 4 Byte, und ich habe doch mit malloc bloß 2 allokiert, also was passiert denn da?</p>
<p>Und dann hätte ich gleich noch eine andere Frage. Wenn ich mehr Speicher allokiere als die Struktur des Zeigers benötigt, was ist dann mit dem Restlichen Speicher? Und kann ich dann auf den noch irgendwie zugreifen?<br />
Wäre auch sehr dankbar für Hinweise auf links ect. wo etwas zum Thema Speicherallokierung steht.<br />
Thx, MfG homie</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1319804</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1319804</guid><dc:creator><![CDATA[homie849]]></dc:creator><pubDate>Fri, 06 Jul 2007 15:09:03 GMT</pubDate></item><item><title><![CDATA[Reply to Zu wenig Speicher für Zeiger Allokieren ?! on Fri, 06 Jul 2007 15:33:28 GMT]]></title><description><![CDATA[<p>homie849 schrieb:</p>
<blockquote>
<p>Ich verstehe einfach nicht, warum der Code Fehlerlos ausgeführt wird. unsigned long benötigt doch 4 Byte, und ich habe doch mit malloc bloß 2 allokiert, also was passiert denn da?</p>
</blockquote>
<p>Das stimmst schon. Dass das &quot;klappt&quot; ist zufall. Liegtwarscheinlich daran, dass das Betriebssystem den Speicher in größeren Happen (4K) zuteilt. Beim nächsten malloc würdest du wohl Probleme bekommen. Aber das ist alles Zufall.</p>
<p>homie849 schrieb:</p>
<blockquote>
<p>Und dann hätte ich gleich noch eine andere Frage. Wenn ich mehr Speicher allokiere als die Struktur des Zeigers benötigt, was ist dann mit dem Restlichen Speicher? Und kann ich dann auf den noch irgendwie zugreifen?</p>
</blockquote>
<p>Ja kann man. Informiere dich einfach über Pointerarithmetik.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1319814</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1319814</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 06 Jul 2007 15:33:28 GMT</pubDate></item><item><title><![CDATA[Reply to Zu wenig Speicher für Zeiger Allokieren ?! on Fri, 06 Jul 2007 15:57:12 GMT]]></title><description><![CDATA[<p>Vielen Dank, endlich beginnt der ganze Themenkomplex mit dem ich mich grad befasse, langsam wieder Sinn zu machen. Mit dem Begriff Pointerarithmetik hab ich auch endlich was, nachdem ich auch suchen kann^^.</p>
<p>MfG homie</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1319823</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1319823</guid><dc:creator><![CDATA[homie849]]></dc:creator><pubDate>Fri, 06 Jul 2007 15:57:12 GMT</pubDate></item><item><title><![CDATA[Reply to Zu wenig Speicher für Zeiger Allokieren ?! on Fri, 06 Jul 2007 16:27:43 GMT]]></title><description><![CDATA[<p>homie849 schrieb:</p>
<blockquote>
<p>Ich verstehe einfach nicht, warum der Code Fehlerlos ausgeführt wird. unsigned long benötigt doch 4 Byte, und ich habe doch mit malloc bloß 2 allokiert, also was passiert denn da?</p>
</blockquote>
<p>ProgChild  schrieb:</p>
<blockquote>
<p>Das stimmst schon. Dass das &quot;klappt&quot; ist zufall. Liegtwarscheinlich daran, dass das Betriebssystem den Speicher in größeren Happen (4K) zuteilt. Beim nächsten malloc würdest du wohl Probleme bekommen. Aber das ist alles Zufall.</p>
</blockquote>
<p>Ich würde dem widersprechen. Das Betriebssystem weißt dem Programm zwei Byte Speicher (im Heap) dynamisch zu. Dadurch, das die Adresse in einem long-zeiger gespeichert wird, kannst du allerdings vier Byte reinschreiben (ohne dass der Compiler einen Fehler ausgbt). Von diesen vier Byte &quot;gehören&quot; zwei dem Programm und die anderen zwei &quot;gehören&quot; entweder niemandem (d. h. sie werden nicht verwendet) oder sie &quot;gehören&quot; einem anderen Programm. Man muss selber dafür sorgen, dass man nur Speicher verwendet, der einem auch &quot;gehört&quot;.</p>
<p>Als Beispiel kannst du auch mal folgendes machen (auch wenn es nicht zu empfehlen ist, so ein Program zu schreiben, weil du andere Programme dadurch beeinflussen könntest):</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

int main()
{
    long* i = (long*)new short;
    cout &lt;&lt; i;
    delete i;
    return 0;
}
</code></pre>
<p>ich verwende jetzt einfach mal der einfachkeit halber &quot;new&quot;. Merk dir die Adresse, die dir das Programm ausgibt, und ändere das Programm um in:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

int main()
{
    long* i = (long*)0x3d2470;
    *i= 5;
    cout &lt;&lt; i &lt;&lt; endl;
    cout &lt;&lt; *i;
    return 0;
}
</code></pre>
<p>wobei &quot;0x3d2470&quot; die Adresse ist, die das Programm davor ausgegeben hat. Wie man sieht beantragt man bei diesem Programm gar keinen Speicher, kann aber trotzdem in den Speicher ohne Fehler reinschreiben (weil die Adresse auf Speicher im Heap verweist).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1319842</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1319842</guid><dc:creator><![CDATA[Absoluter Anfänger]]></dc:creator><pubDate>Fri, 06 Jul 2007 16:27:43 GMT</pubDate></item><item><title><![CDATA[Reply to Zu wenig Speicher für Zeiger Allokieren ?! on Mon, 09 Jul 2007 08:28:25 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/731">@Anfänger</a>: Du hast vergessen, deinen Beitrag mit &quot;probiert das ja nicht zu Hause&quot; zu überschreiben <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="😉"
    /> Sowas kann tatsächlich unter Debug-Bedingungen gut gehen - aber sobald du das Programm mit leicht geänderten Compiler-Einstellungen übersetzt, fliegt es dir um die Ohren.</p>
<p>Übrigens gehören die 2 Byte, die du fälschlicherweise benutzt, vermutlich nicht einem anderen Programm, sondern dem Heap-Manager <em>deines</em> Programmes. Und wenn du dem seine Steuerdaten pulverisierst, fliegt dir der womöglich schon beim nächsten malloc() dein Programm um die Ohren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1321217</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1321217</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 09 Jul 2007 08:28:25 GMT</pubDate></item><item><title><![CDATA[Reply to Zu wenig Speicher für Zeiger Allokieren ?! on Mon, 09 Jul 2007 09:53:59 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10318">@CStoll</a> Ich hab' ja zumindest geschrieben, dass es nicht empfehlenswert ist es so zu machen. Dachte, das reicht. <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>Das Beispiel war auch eigentlich nur dafür da, zu verdeutlichen, dass Betriebssysteme nicht umbedingt eine Fehlermeldung ausgeben müssen, wenn man auf Speicher-Addressen zugreift, die Betriebssysteme auch zur &quot;Verfügung&quot; stellen würden, wenn man Speicher dynamisch beantragen würde.</p>
<p>Um ehrlich zu sein, kenne ich mich aber jetzt auch nicht so gut mit Speicherverwaltung aus, sondern habe versucht, mir vieles selber zu erklären durch Testprogramme, wie jenes (kann auch gut sein, dass ich da vieles falsch interpretiert habe).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1321297</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1321297</guid><dc:creator><![CDATA[Absoluter Anfänger]]></dc:creator><pubDate>Mon, 09 Jul 2007 09:53:59 GMT</pubDate></item><item><title><![CDATA[Reply to Zu wenig Speicher für Zeiger Allokieren ?! on Mon, 09 Jul 2007 12:28:08 GMT]]></title><description><![CDATA[<p>Viele Heap Implementierungen allozieren immer mindestens die grösse eines Zeigers, also 4 Byte auf normalen 32 Bit Systemen, oft auch die Grösse von 2 Zeigern oder nochmehr, also 8 oder gar 16 Byte.</p>
<p>Dadurch wird auch oft nix passieren wenn man 2 Byte anfordert aber 4 verwendet, auch nicht wenn man den Speicher wieder freigibt oder danach wieder Speicher anfordert.</p>
<p>Die 4K gibts an anderen Stellen, nämlich wenn man übers OS Speicher seitenweise anfordert - ein Heap wird aber immer feiner auflösen als 4K.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1321478</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1321478</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 09 Jul 2007 12:28:08 GMT</pubDate></item><item><title><![CDATA[Reply to Zu wenig Speicher für Zeiger Allokieren ?! on Mon, 09 Jul 2007 13:55:59 GMT]]></title><description><![CDATA[<p>Absoluter Anfänger schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10318">@CStoll</a> Ich hab' ja zumindest geschrieben, dass es nicht empfehlenswert ist es so zu machen. Dachte, das reicht. <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>
<p>War zu unauffällig, deswegen hatte ich das übersehen.</p>
<blockquote>
<p>Das Beispiel war auch eigentlich nur dafür da, zu verdeutlichen, dass Betriebssysteme nicht umbedingt eine Fehlermeldung ausgeben müssen, wenn man auf Speicher-Addressen zugreift, die Betriebssysteme auch zur &quot;Verfügung&quot; stellen würden, wenn man Speicher dynamisch beantragen würde.</p>
</blockquote>
<p>Das Beispiel zeigt vor allem, wie weit &quot;undefiniertes Verhalten&quot; gehen kann. Mit etwas &quot;Glück&quot; schaffst du es tatsächlich, dein Programm zum Laufen zu bringe, ohne daß Windows oder andere Prozesse dagegen protestieren. Aber Fakt ist, du <strong>kannst</strong> nicht voraussagen, was passiert, wenn du es startest (die Möglichkeiten reichen von &quot;funktioniert anscheinend reibungslos&quot; über &quot;formatiert deine Festplatte&quot; bis zu &quot;löst den vierten Weltkrieg aus&quot; (OK, letzteres ist etwas unwahrscheinlicher :D)).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1321559</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1321559</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 09 Jul 2007 13:55:59 GMT</pubDate></item></channel></rss>