<?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[Zugriffsprobleme]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe mir in einer Klasse eine statische Methode zum Trimmen von einem char-Array geschrieben.<br />
Und weil ich mich hier melde... funktioniert es natürlich nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":-/"
      alt="😕"
    /></p>
<p>Wenn der Code abschmiert, kann ich in meinem Debugger noch die Werte zum Zeitpunkt des Absturzes ansehen und die machen alle Sinn. Anbei der Code:</p>
<p>Main.cpp</p>
<pre><code>int main(){
   char* s = &quot;   Hallo Welt!   &quot;; //17 Zeichen inkl. der Leerzeichen
   cout &lt;&lt; &quot;Vorher: &quot; &lt;&lt; s &lt;&lt; endl;
   MyFunction::Trim(s, 17);
   cout &lt;&lt; &quot;Nachher: &quot; &lt;&lt; s &lt;&lt; endl;
   return 0;
}
</code></pre>
<p>MyFunction.h</p>
<pre><code>class MyFunction{
   public:
   static void Trim(char* s, unsigned int Length){
	unsigned int fi = 0, fj = 0, fStart = 0, fEnd = Length - 1;
	char* sc = new char[Length];
	strcpy(sc, s);

	while (s[fStart] == ' '){ fStart++; }
	while (s[fEnd] == ' '){ fEnd--; }

	for (fi = fStart; fi &lt;= fEnd; fi++){
		s[fj++] = sc[fi]; //Hier steigt der Debugger aus
                /*Eine Überprüfung von s und sc ergibt, dass beide
                &quot;   Hallo Welt!   &quot; enthalten. 
                Variablen:
                fi = fStart = 3, fEnd = 13, fj=0*/
	}

	s[fj] = '\0';
	free(sc);
   }
}
</code></pre>
<p>Der Fehler lautet:<br />
&quot;Ausnahmefehler bei 0x000000013FB498C9 in ReadNastranMesh3D.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0x000000013FB54188&quot;</p>
<p>Sorry, aber ich verstehe es nicht. In s[0] scheint er nicht zu schreiben dürfen.<br />
Kann es an dem &quot;static&quot; void liegen?</p>
<p>Vielen Dank, dass Ihr Euch das anseht.</p>
<p>Grüße,<br />
CJens</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/324208/zugriffsprobleme</link><generator>RSS for Node</generator><lastBuildDate>Tue, 14 Jul 2026 19:33:13 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/324208.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 06 Mar 2014 20:17:35 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zugriffsprobleme on Thu, 06 Mar 2014 20:30:16 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe mir in einer Klasse eine statische Methode zum Trimmen von einem char-Array geschrieben.<br />
Und weil ich mich hier melde... funktioniert es natürlich nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":-/"
      alt="😕"
    /></p>
<p>Wenn der Code abschmiert, kann ich in meinem Debugger noch die Werte zum Zeitpunkt des Absturzes ansehen und die machen alle Sinn. Anbei der Code:</p>
<p>Main.cpp</p>
<pre><code>int main(){
   char* s = &quot;   Hallo Welt!   &quot;; //17 Zeichen inkl. der Leerzeichen
   cout &lt;&lt; &quot;Vorher: &quot; &lt;&lt; s &lt;&lt; endl;
   MyFunction::Trim(s, 17);
   cout &lt;&lt; &quot;Nachher: &quot; &lt;&lt; s &lt;&lt; endl;
   return 0;
}
</code></pre>
<p>MyFunction.h</p>
<pre><code>class MyFunction{
   public:
   static void Trim(char* s, unsigned int Length){
	unsigned int fi = 0, fj = 0, fStart = 0, fEnd = Length - 1;
	char* sc = new char[Length];
	strcpy(sc, s);

	while (s[fStart] == ' '){ fStart++; }
	while (s[fEnd] == ' '){ fEnd--; }

	for (fi = fStart; fi &lt;= fEnd; fi++){
		s[fj++] = sc[fi]; //Hier steigt der Debugger aus
                /*Eine Überprüfung von s und sc ergibt, dass beide
                &quot;   Hallo Welt!   &quot; enthalten. 
                Variablen:
                fi = fStart = 3, fEnd = 13, fj=0*/
	}

	s[fj] = '\0';
	free(sc);
   }
}
</code></pre>
<p>Der Fehler lautet:<br />
&quot;Ausnahmefehler bei 0x000000013FB498C9 in ReadNastranMesh3D.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0x000000013FB54188&quot;</p>
<p>Sorry, aber ich verstehe es nicht. In s[0] scheint er nicht zu schreiben dürfen.<br />
Kann es an dem &quot;static&quot; void liegen?</p>
<p>Vielen Dank, dass Ihr Euch das anseht.</p>
<p>Grüße,<br />
CJens</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2387247</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2387247</guid><dc:creator><![CDATA[CJens]]></dc:creator><pubDate>Thu, 06 Mar 2014 20:30:16 GMT</pubDate></item><item><title><![CDATA[Reply to Zugriffsprobleme on Thu, 06 Mar 2014 20:28:52 GMT]]></title><description><![CDATA[<p>Darf er auch nicht, dein &quot; Hallo Welt! &quot; liegt in schreibgeschütztem Speicher.</p>
<p>Du könntest dir dein Leben um nen großen Faktor leichter machen, wenn du std::string benutzen würdest, vorallem da du hier im C++ Forum fragst. Du hast da aber C Code.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2387249</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2387249</guid><dc:creator><![CDATA[KN4CK3R]]></dc:creator><pubDate>Thu, 06 Mar 2014 20:28:52 GMT</pubDate></item><item><title><![CDATA[Reply to Zugriffsprobleme on Thu, 06 Mar 2014 20:35:47 GMT]]></title><description><![CDATA[<p>KN4CK3R schrieb:</p>
<blockquote>
<p>Du hast da aber C Code.</p>
</blockquote>
<p>Bitte, in C++ kann vieles als C Code bezeichnet werden. Trotzdem ist es gueltiges C++.</p>
<p>Ansonsten:</p>
<pre><code class="language-cpp">char* sc = new char[Length];
</code></pre>
<p>Sollte mit <code>delete</code> freigegeben werden. <code>malloc</code> und <code>new</code> muessen sich nicht gut vertragen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2387251</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2387251</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Thu, 06 Mar 2014 20:35:47 GMT</pubDate></item><item><title><![CDATA[Reply to Zugriffsprobleme on Thu, 06 Mar 2014 20:34:32 GMT]]></title><description><![CDATA[<p>...und kann ich den Speicher irgendwie für ihn freigeben?</p>
<p>Die Zeichenkette ist deshalb ein Char, weil ich die Daten aus einer formatierten Datei auslese, ich bis vor kurzem reines C Programmiert habe, jetzt aber versuche auf C++ zu erweitern und, weil ich auch keine Methode zum Trimmen von Strings gefunden habe... was nicht heissen muss, dass es keine gibt. Hab was aus dem Header &lt;ctype.h&gt; gefunden... aber ich will keinen kompletten Header einbinden, weil ich einmal eine Funktion brauche... vor allem, wenn meine Funktion ja methodisch funktioniert.</p>
<p>Ich würde daher trotzdem gerne wissen, wie eine Methode aus meiner Klasse eine Variable von der Main-Funktion, dessen Adresse die Methode kennt, verändern kann. Geht das?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2387252</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2387252</guid><dc:creator><![CDATA[CJens]]></dc:creator><pubDate>Thu, 06 Mar 2014 20:34:32 GMT</pubDate></item><item><title><![CDATA[Reply to Zugriffsprobleme on Thu, 06 Mar 2014 20:38:52 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<p>KN4CK3R schrieb:</p>
<blockquote>
<p>Du hast da aber C Code.</p>
</blockquote>
<p>Bitte, in C++ kann vieles als C Code bezeichnet werden. Trotzdem ist es gueltiges C++.</p>
<p>Ansonsten:</p>
<pre><code class="language-cpp">char* sc = new char[Length];
</code></pre>
<p>Sollte mit <code>delete</code> freigegeben werden. <code>malloc</code> und <code>new</code> muessen sich nicht gut vertragen.</p>
</blockquote>
<p>Hi, also das habe ich geändert... ändert aber nichts an dem Fehler. Anbei der aktuelle Code:</p>
<pre><code>static void Trim(char* s, unsigned int Length){
	unsigned int fi = 0, fj = 0, fStart = 0, fEnd = Length - 1;
	char* sc = new char[Length];

	strcpy(sc, s);

	while (s[fStart] == ' '){ fStart++; }
	while (s[fEnd] == ' '){ fEnd--; }

	for (fi = fStart; fi &lt;= fEnd; fi++){
		s[fj++] = sc[fi];
	}

	s[fj] = '\0';
	delete(sc);
	}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2387254</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2387254</guid><dc:creator><![CDATA[CJens]]></dc:creator><pubDate>Thu, 06 Mar 2014 20:38:52 GMT</pubDate></item><item><title><![CDATA[Reply to Zugriffsprobleme on Thu, 06 Mar 2014 20:41:33 GMT]]></title><description><![CDATA[<blockquote>
<p>Geht das?</p>
</blockquote>
<p>Ja geht.</p>
<blockquote>
<p>Variable von der Main-Funktion</p>
</blockquote>
<p>Der Zeiger liegt in <code>main</code> , aber dein String &quot; Hallo Welt! &quot; liegt woanders. Loesung: char s[145] = &quot; jeha machen &quot;. Btw. leider trimmt dein Funktion den String nicht, sondern verschiebt ihn nur im Speicher.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2387255</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2387255</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Thu, 06 Mar 2014 20:41:33 GMT</pubDate></item><item><title><![CDATA[Reply to Zugriffsprobleme on Thu, 06 Mar 2014 20:42:16 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<p>KN4CK3R schrieb:</p>
<blockquote>
<p>Du hast da aber C Code.</p>
</blockquote>
<p>Bitte, in C++ kann vieles als C Code bezeichnet werden. Trotzdem ist es gueltiges C++.</p>
</blockquote>
<p>klar, ist es gültiges C++ und trotzdem ist sein Code in der Form im C Forum besser aufgehoben. Sein Name ist ja auch CJens und nicht C++Jens.</p>
<p>Dein Code geht immernoch nicht, weil du immernoch auf schreibgeschützten Speicher zugreifst. Entweder kopierst du s und gibst die Kopie zurück + kümmerst dich um die Speicherverwaltung oder halt std::string.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2387256</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2387256</guid><dc:creator><![CDATA[KN4CK3R]]></dc:creator><pubDate>Thu, 06 Mar 2014 20:42:16 GMT</pubDate></item><item><title><![CDATA[Reply to Zugriffsprobleme on Thu, 06 Mar 2014 20:44:37 GMT]]></title><description><![CDATA[<p>Das Problem ist, das s auf eine Speicherbereich zeigt, den du nicht verändern darfst.</p>
<p>Entweder machst du in main</p>
<pre><code>char s[] = &quot;   Hallo Welt!   &quot;;
</code></pre>
<p>Dann hast du ein Array (auf dem Stack).</p>
<p>Oder du machst das <code>char* sc = new char[Length];</code> in main. Dann kannst du das Stringliteral dahin kopieren. (Dann musst du aber auch sc an Trim übergeben)</p>
<p>Den Speicher in Trim zu besorgen bringt mit <code>void</code> als Rückgabewert nicht viel.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2387258</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2387258</guid><dc:creator><![CDATA[DirkB]]></dc:creator><pubDate>Thu, 06 Mar 2014 20:44:37 GMT</pubDate></item><item><title><![CDATA[Reply to Zugriffsprobleme on Thu, 06 Mar 2014 21:12:38 GMT]]></title><description><![CDATA[<p>DirkB schrieb:</p>
<blockquote>
<p>Das Problem ist, das s auf eine Speicherbereich zeigt, den du nicht verändern darfst.</p>
<p>Entweder machst du in main</p>
<pre><code>char s[] = &quot;   Hallo Welt!   &quot;;
</code></pre>
<p>Dann hast du ein Array (auf dem Stack).</p>
<p>Oder du machst das <code>char* sc = new char[Length];</code> in main. Dann kannst du das Stringliteral dahin kopieren. (Dann musst du aber auch sc an Trim übergeben)</p>
<p>Den Speicher in Trim zu besorgen bringt mit <code>void</code> als Rückgabewert nicht viel.</p>
</blockquote>
<p>Vielen Dank, funktioniert wunderbar... <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="👍"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_savoring_food"
      title=":yum:"
      alt="😋"
    /></p>
<p>main.cpp</p>
<pre><code>char* s = new char[18];
	strcpy(s, &quot;   Hallo Welt!   \0&quot;);
	cout &lt;&lt; &quot;Vorher: &quot; &lt;&lt; s &lt;&lt; endl; //   Hallo Welt!   #ENDE
	MyFunction::Trim(s, 18);
	cout &lt;&lt; &quot;Nachher: &quot; &lt;&lt; s &lt;&lt; endl;//Hallo Welt!#ENDE
</code></pre>
<p>MyFunction.h</p>
<pre><code>unsigned int fi = 0, fj = 0, fStart = 0, fEnd = Length - 1;
	char* sc = new char[Length];

	strcpy(sc, s);

	while (s[fStart] == ' '){ fStart++; }
	while (s[fEnd] == ' '){ fEnd--; }

	for (fi = fStart; fi &lt;= fEnd; fi++){
		s[fj++] = sc[fi];
	}

	s[fj] = '\0';
	delete(sc);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2387262</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2387262</guid><dc:creator><![CDATA[CJens]]></dc:creator><pubDate>Thu, 06 Mar 2014 21:12:38 GMT</pubDate></item><item><title><![CDATA[Reply to Zugriffsprobleme on Thu, 06 Mar 2014 21:20:16 GMT]]></title><description><![CDATA[<p>Das Gegenstück von new[] ist delete[], delete ist das Gegenstück von new.</p>
<pre><code>delete[] sc;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2387263</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2387263</guid><dc:creator><![CDATA[Flashput]]></dc:creator><pubDate>Thu, 06 Mar 2014 21:20:16 GMT</pubDate></item><item><title><![CDATA[Reply to Zugriffsprobleme on Thu, 06 Mar 2014 21:33:26 GMT]]></title><description><![CDATA[<p>In einem Stringliteral brauchst du die \0 nicht mit angeben. Das macht der Compiler automatisch.<br />
Und daher kann Trim die Länge auch alleine feststellen. Daher ist der Parameter Length überflüssig.</p>
<p>sc brauchst du auch nicht in Trim.<br />
Zeile 10 wäre dann <code>s[fj++] = s[fi];</code></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2387266</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2387266</guid><dc:creator><![CDATA[DirkB]]></dc:creator><pubDate>Thu, 06 Mar 2014 21:33:26 GMT</pubDate></item><item><title><![CDATA[Reply to Zugriffsprobleme on Thu, 06 Mar 2014 21:53:38 GMT]]></title><description><![CDATA[<p>Uups, habe falsch gelesen, zweimal fj</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2387268</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2387268</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 06 Mar 2014 21:53:38 GMT</pubDate></item><item><title><![CDATA[Reply to Zugriffsprobleme on Thu, 06 Mar 2014 21:52:12 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">s[fj++] = s[fi];
</code></pre>
<p>ist vergleichbar mit</p>
<pre><code class="language-cpp">s[fj] = s[fi]
fj++;
</code></pre>
<p>Btw: Als C++ Programmierer iteriere ich auch manchmal gern so:</p>
<pre><code class="language-cpp">v = *jeha++
</code></pre>
<p>Ansonsten: Nur die Harten kommen in den Garten. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2387270</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2387270</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Thu, 06 Mar 2014 21:52:12 GMT</pubDate></item><item><title><![CDATA[Reply to Zugriffsprobleme on Thu, 06 Mar 2014 21:52:08 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>DirkB schrieb:</p>
<blockquote>
<p>Zeile 10 wäre dann <code>s[fj++] = s[fi];</code></p>
</blockquote>
<p>Da hätte ich ein wenig Bammel, wann genau das ++ bewirkt wird.</p>
</blockquote>
<p>f<strong>j</strong> und f<strong>i</strong> sind unterschiedliche Variablen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2387271</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2387271</guid><dc:creator><![CDATA[DirkB]]></dc:creator><pubDate>Thu, 06 Mar 2014 21:52:08 GMT</pubDate></item><item><title><![CDATA[Reply to Zugriffsprobleme on Fri, 07 Mar 2014 00:00:54 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<p>KN4CK3R schrieb:</p>
<blockquote>
<p>Du hast da aber C Code.</p>
</blockquote>
<p>Bitte, in C++ kann vieles als C Code bezeichnet werden. Trotzdem ist es gueltiges C++.</p>
<p>Ansonsten:</p>
<pre><code class="language-cpp">char* sc = new char[Length];
</code></pre>
<p>Sollte mit <code>delete</code> freigegeben werden. <code>malloc</code> und <code>new</code> muessen sich nicht gut vertragen.</p>
</blockquote>
<p>Hi,</p>
<p>also, das klappt soweit ganz gut, dass man den einzelnen Komponenten des Arrays sofort einen Wert zuweist. Bei den char arrays ist das egal, aber kann man, wenn man z.B. ein int Array benötigt und über</p>
<pre><code>int* Arr = new int[nArr]; //Alte Speicherwerte bleiben
</code></pre>
<p>auch festlegen, dass alle Felder den Wert 0 haben? Das ist nämlich nicht so. Wenn ich jedoch</p>
<pre><code>int* Arr = (int*)calloc(nArr, sizeof(int)); //Alle Komponenten mit 0 initialisiert
</code></pre>
<p>benutze, ist das komplette Array mit 0 initialisiert. Kann man das über &quot;new&quot; auch machen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2387282</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2387282</guid><dc:creator><![CDATA[CJens]]></dc:creator><pubDate>Fri, 07 Mar 2014 00:00:54 GMT</pubDate></item><item><title><![CDATA[Reply to Zugriffsprobleme on Fri, 07 Mar 2014 06:48:12 GMT]]></title><description><![CDATA[<pre><code>int* Arr = new int[nArr](0);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2387299</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2387299</guid><dc:creator><![CDATA[Fytch]]></dc:creator><pubDate>Fri, 07 Mar 2014 06:48:12 GMT</pubDate></item></channel></rss>