<?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[Speicherschutzverletzung geschachtelten structs]]></title><description><![CDATA[<p>Hallöchen,</p>
<p>in einem Projekt von mir nutze ich eine (?) anonyme struct, in der sich wiederum eine anonyme struct befindet, die dann schließlich den eigentlichen Inhalt enthält.</p>
<p>Kompilieren tut das wunderbar, aber bei der Ausführung brichts immer mit dem schönen Fehlercode 0xC000000005 ab.</p>
<p>Habe mal zur Veranschaulichung ein kleines Programm dazu geschrieben:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

struct
{
	struct
	{
		char data[4];
	} innerStruct;
} *outerStruct;

int main()
{
    outerStruct-&gt;innerStruct.data[0] = 'a';
    return 0;
}
</code></pre>
<p>Die Struktur der struct ist exakt so wie in meinem eigentlichen Projekt (erst Pointer, dann normaler Zugriff und dann char-Array) und auch in diesem Testprogramm krieg ich eine Speicherschutzverletzung.</p>
<p>Wo hab ich da den Denkfehler?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/284386/speicherschutzverletzung-geschachtelten-structs</link><generator>RSS for Node</generator><lastBuildDate>Sat, 22 Aug 2026 00:19:07 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/284386.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 31 Mar 2011 11:40:14 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Speicherschutzverletzung geschachtelten structs on Thu, 31 Mar 2011 11:40:14 GMT]]></title><description><![CDATA[<p>Hallöchen,</p>
<p>in einem Projekt von mir nutze ich eine (?) anonyme struct, in der sich wiederum eine anonyme struct befindet, die dann schließlich den eigentlichen Inhalt enthält.</p>
<p>Kompilieren tut das wunderbar, aber bei der Ausführung brichts immer mit dem schönen Fehlercode 0xC000000005 ab.</p>
<p>Habe mal zur Veranschaulichung ein kleines Programm dazu geschrieben:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

struct
{
	struct
	{
		char data[4];
	} innerStruct;
} *outerStruct;

int main()
{
    outerStruct-&gt;innerStruct.data[0] = 'a';
    return 0;
}
</code></pre>
<p>Die Struktur der struct ist exakt so wie in meinem eigentlichen Projekt (erst Pointer, dann normaler Zugriff und dann char-Array) und auch in diesem Testprogramm krieg ich eine Speicherschutzverletzung.</p>
<p>Wo hab ich da den Denkfehler?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2042739</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2042739</guid><dc:creator><![CDATA[Subsurf]]></dc:creator><pubDate>Thu, 31 Mar 2011 11:40:14 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherschutzverletzung geschachtelten structs on Thu, 31 Mar 2011 11:43:55 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Du hast ja für deine struct outerStruct auch keinen Speicher reserviert. Warum ist das ein Zeiger?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2042741</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2042741</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Thu, 31 Mar 2011 11:43:55 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherschutzverletzung geschachtelten structs on Thu, 31 Mar 2011 11:50:46 GMT]]></title><description><![CDATA[<p>outerStruct ist ein Null-Zeiger.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2042745</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2042745</guid><dc:creator><![CDATA[null_zeiger]]></dc:creator><pubDate>Thu, 31 Mar 2011 11:50:46 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherschutzverletzung geschachtelten structs on Thu, 31 Mar 2011 12:18:04 GMT]]></title><description><![CDATA[<p>Dann darfst du ihn auch nicht dereferenzieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2042753</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2042753</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Thu, 31 Mar 2011 12:18:04 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherschutzverletzung geschachtelten structs on Thu, 31 Mar 2011 13:05:09 GMT]]></title><description><![CDATA[<p>Du musst eben schon für dein Objekt Speicher reservieren wenn du es auf den Heap packen willst. Einen uninitialisierten Zeiger bzw einen auf Null zu dereferenzieren hat ein undefiniertes Verhalten zu Folge, wie du bei dir ja siehst;-)</p>
<p>null_zeiger schrieb:</p>
<blockquote>
<p>outerStruct ist ein Null-Zeiger.</p>
</blockquote>
<p>Ne ist es eigentlich nicht, dazu müsste man ihm schon 0 zuweisen. Allerdings ist auch dann undefiniertes Verhalten angesagt, es macht also im Endeffekt keinen Unterschied, nur dass man erkennt dass er noch auf nichts verweist und daher nicht dereferenziert werden sollte.</p>
<p>Lg freeG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2042769</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2042769</guid><dc:creator><![CDATA[fr33g]]></dc:creator><pubDate>Thu, 31 Mar 2011 13:05:09 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherschutzverletzung geschachtelten structs on Thu, 31 Mar 2011 13:15:25 GMT]]></title><description><![CDATA[<p>Doch, es ist ein Nullzeiger. Variablen mit static storage duration werden automatisch null-initialisiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2042774</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2042774</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Thu, 31 Mar 2011 13:15:25 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherschutzverletzung geschachtelten structs on Thu, 31 Mar 2011 13:18:46 GMT]]></title><description><![CDATA[<p>fr33g schrieb:</p>
<blockquote>
<p>Ne ist es eigentlich nicht, dazu müsste man ihm schon 0 zuweisen.</p>
</blockquote>
<p>Manche Compiler setzten uninitialisierte Zeiger im Debugmodus auf 0. So gesehen könnte es auch ein Nullzeiger sein. Allerdings sagt ja schon die Fehlermeldung das es nicht so ist.</p>
<p>seldon schrieb:</p>
<blockquote>
<p>Doch, es ist ein Nullzeiger. Variablen mit static storage duration werden automatisch null-initialisiert.</p>
</blockquote>
<p>Kannst du mir die Stelle im Standard zeigen wo das steht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2042776</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2042776</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Thu, 31 Mar 2011 13:18:46 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherschutzverletzung geschachtelten structs on Thu, 31 Mar 2011 13:49:23 GMT]]></title><description><![CDATA[<p>Nicht aus dem Standard, sondern aus dem Standardbuch:</p>
<p>Bjarne Stroustrup schrieb:</p>
<blockquote>
<p>...wird jede Variable, die außerhalb einer Funktion definiert ist ([...]), vor dem Aufruf von main() initialisiert. [...] Falls eine solche Variable keinen expliziten Initialisierer hat, wird sie standardmäßig auf den Default ihres Typs initialisiert. Der Default-Initialisierer für eingebaute Typen und Aufzählungen ist 0.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2042790</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2042790</guid><dc:creator><![CDATA[_Falke]]></dc:creator><pubDate>Thu, 31 Mar 2011 13:49:23 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherschutzverletzung geschachtelten structs on Thu, 31 Mar 2011 14:55:12 GMT]]></title><description><![CDATA[<p>Ja gut das stimmt, Variabeln von internen Datentypen die außerhalb einer Funktion( also global ) deklariert wurden, werden automatisch mit 0 initialisiert. Wusste blos nicht dass dies auch für Zeiger gilt, was aber eigentlich ja auch logisch ist.´<br />
Auf jeden Fall ändert dies ja nichts am undefinierten Verhalten. Wenn der Zeiger aber in der main() deklariert wird, dann is er uninitialisiert.</p>
<p>Lg freeG</p>
<p>Edit: Und meistens deklariert man ja einen Zeiger erst dann wenn man ihn braucht und initialisiert ihn dann auch. Sofern man überhaupt Zeiger nutzt, was ja nicht soo oft nötig ist, mal abgesehen von virtueller Polymorphie. Generell würd ich Zeiger sofort initialisieren und falls nicht einfach generell mit = 0 initialisieren( denn es kommt ja sehr selten vor dass das außerhalb einer Funktion geschieht und wenn doch macht ein = 0 ja auch nix aus ) damit man wenigstens weiß dass man ihn besser nicht dereferenzieren sollte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2042800</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2042800</guid><dc:creator><![CDATA[fr33g]]></dc:creator><pubDate>Thu, 31 Mar 2011 14:55:12 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherschutzverletzung geschachtelten structs on Fri, 01 Apr 2011 14:47:39 GMT]]></title><description><![CDATA[<p>Mh... dachte man könnte an der Stelle auch einfach einen Zeiger auf die anonyme struct erzeugen anstelle eines Variablennamens. Aber nagut, dann muss ichs doch anders machen <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2043300</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2043300</guid><dc:creator><![CDATA[Subsurf]]></dc:creator><pubDate>Fri, 01 Apr 2011 14:47:39 GMT</pubDate></item></channel></rss>