<?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[segmentation fault - für anfänger?]]></title><description><![CDATA[<p>HOihoi mein Compiler, mit dem ich mein kleines Programm geschrieben hab, gibt mir bei der Fehlersuche &quot;Zugriffsverletzung(Segmentation fault)&quot; aus, kann mir mal jemand bitte eine <strong>für Anfänger verständliche</strong> Erklärung/Lösung zeigen, um mein programm zum laufen zu bekommen?! Hier der Quellcode:</p>
<pre><code>[cpp]#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;string&gt;
using namespace std;

int main()
{
    int woerter=0;
    int zeichen=0;
    int saetze=0;

    fstream quelle;
    string quelldateiname;
    string datei;
    cout &lt;&lt; &quot;Quelldatei : &quot;;
    cin &gt;&gt; quelldateiname;

    // Datei öffnen, lesen, schließen
    quelle.open(quelldateiname.c_str(), ios::binary|ios::in);
    quelle.read(reinterpret_cast&lt;char*&gt;(&amp;datei), sizeof(datei));
    quelle.close();

    if (!quelle)
       cout &lt;&lt; &quot;Dateierror&quot; &lt;&lt; &quot;\n--------------&quot; &lt;&lt; endl;

    for (int i=0; i&lt;datei.size(); i++)
    {
          zeichen++;

          //vermeidet d. einlesen einer leerzeichen- Reihe
          while (datei[i] == datei[i++] &amp;&amp; datei[i++] == ' ')
          {
             i++;
          }
          if (datei[i] == ' ')
              woerter++;

          //fragt die anzahl d. punkte (Sätze) in der Datei ab, vermeidet einlesen von z.B. &quot;...&quot;
          while (datei[i] == datei[i++] &amp;&amp; datei[i++] == '.')
          {
             i++;
          }
          if (datei[i] == '.')
              saetze++;
    }

    cout &lt;&lt; &quot;Woerter    : &quot; &lt;&lt; woerter &lt;&lt; endl;
    cout &lt;&lt; &quot;Zeichen    : &quot; &lt;&lt; zeichen &lt;&lt; endl;
    cout &lt;&lt; &quot;Saetze     : &quot; &lt;&lt; saetze &lt;&lt; endl;
    system(&quot;pause&quot;);
}
[/cpp]
</code></pre>
<p>Das problem liegt laut Fehlersuche nach &quot;quelle.open(quelldateiname.c_str(), ios::binary|ios::in);&quot;, Compiler compiliert zwar, bricht aber nach d. eingabe des Dateinamen ab (zeigt nicht mal mehr &quot;Dateierror&quot;) und hinterlässt mir die Fehlermeldung &quot;Unbenannt2.exe <em>(-&gt;name d. programms)</em> hat ein Problem festgestellt und muss beendet werden&quot; =&gt; Was kann ich tun, um mein Programm zum laufen zu bringen?? Bitte HILFe <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=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/201175/segmentation-fault-für-anfänger</link><generator>RSS for Node</generator><lastBuildDate>Mon, 05 Oct 2026 21:52:17 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/201175.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 25 Dec 2007 19:38:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to segmentation fault - für anfänger? on Tue, 25 Dec 2007 19:38:00 GMT]]></title><description><![CDATA[<p>HOihoi mein Compiler, mit dem ich mein kleines Programm geschrieben hab, gibt mir bei der Fehlersuche &quot;Zugriffsverletzung(Segmentation fault)&quot; aus, kann mir mal jemand bitte eine <strong>für Anfänger verständliche</strong> Erklärung/Lösung zeigen, um mein programm zum laufen zu bekommen?! Hier der Quellcode:</p>
<pre><code>[cpp]#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;string&gt;
using namespace std;

int main()
{
    int woerter=0;
    int zeichen=0;
    int saetze=0;

    fstream quelle;
    string quelldateiname;
    string datei;
    cout &lt;&lt; &quot;Quelldatei : &quot;;
    cin &gt;&gt; quelldateiname;

    // Datei öffnen, lesen, schließen
    quelle.open(quelldateiname.c_str(), ios::binary|ios::in);
    quelle.read(reinterpret_cast&lt;char*&gt;(&amp;datei), sizeof(datei));
    quelle.close();

    if (!quelle)
       cout &lt;&lt; &quot;Dateierror&quot; &lt;&lt; &quot;\n--------------&quot; &lt;&lt; endl;

    for (int i=0; i&lt;datei.size(); i++)
    {
          zeichen++;

          //vermeidet d. einlesen einer leerzeichen- Reihe
          while (datei[i] == datei[i++] &amp;&amp; datei[i++] == ' ')
          {
             i++;
          }
          if (datei[i] == ' ')
              woerter++;

          //fragt die anzahl d. punkte (Sätze) in der Datei ab, vermeidet einlesen von z.B. &quot;...&quot;
          while (datei[i] == datei[i++] &amp;&amp; datei[i++] == '.')
          {
             i++;
          }
          if (datei[i] == '.')
              saetze++;
    }

    cout &lt;&lt; &quot;Woerter    : &quot; &lt;&lt; woerter &lt;&lt; endl;
    cout &lt;&lt; &quot;Zeichen    : &quot; &lt;&lt; zeichen &lt;&lt; endl;
    cout &lt;&lt; &quot;Saetze     : &quot; &lt;&lt; saetze &lt;&lt; endl;
    system(&quot;pause&quot;);
}
[/cpp]
</code></pre>
<p>Das problem liegt laut Fehlersuche nach &quot;quelle.open(quelldateiname.c_str(), ios::binary|ios::in);&quot;, Compiler compiliert zwar, bricht aber nach d. eingabe des Dateinamen ab (zeigt nicht mal mehr &quot;Dateierror&quot;) und hinterlässt mir die Fehlermeldung &quot;Unbenannt2.exe <em>(-&gt;name d. programms)</em> hat ein Problem festgestellt und muss beendet werden&quot; =&gt; Was kann ich tun, um mein Programm zum laufen zu bringen?? Bitte HILFe <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=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1426055</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1426055</guid><dc:creator><![CDATA[double *T]]></dc:creator><pubDate>Tue, 25 Dec 2007 19:38:00 GMT</pubDate></item><item><title><![CDATA[Reply to segmentation fault - für anfänger? on Tue, 25 Dec 2007 20:19:09 GMT]]></title><description><![CDATA[<p>Der Fehler liegt hier (1):</p>
<pre><code class="language-cpp">quelle.read(reinterpret_cast&lt;char*&gt;(&amp;datei), sizeof(datei));
</code></pre>
<p>und</p>
<pre><code class="language-cpp">while (datei[i] == datei[i++] &amp;&amp; datei[i++] == ' ')
</code></pre>
<p>hier(2) und</p>
<pre><code class="language-cpp">while (datei[i] == datei[i++] &amp;&amp; datei[i++] == '.')
</code></pre>
<p>(3) usw.</p>
<p>(1) std::string ist kein POD (oder besteht nicht ausschließlich aus diesen) und kann d.h. nicht einfach so gespeichert werden! (Das Problem ist, das std::string intern mit einem Zeiger arbeitet um eine dynamische Stringlänge möglich zu machen ... ). Schreib nicht &quot;binär&quot; und nutze einfach den operator&lt;&lt; bzw. &gt;&gt; um Daten rein und raus zu schreiben.<br />
(2) deine Schleife geht von i = 0 bis i &lt; string_länge ... wenn i = string_länge - 1 und du dann i zwei mal Inkrementierst (i++), ist i = string_länge + 1 und damit greifst du in einen undefinierten Bereich, was zu undefiniertem Verhalten führt.<br />
(3) s. (2).</p>
<p>usw. noch ein paar Kleinigkeiten sind falsch ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1426075</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1426075</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Tue, 25 Dec 2007 20:19:09 GMT</pubDate></item><item><title><![CDATA[Reply to segmentation fault - für anfänger? on Tue, 25 Dec 2007 20:43:44 GMT]]></title><description><![CDATA[<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f4a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--light_bulb"
      title=":bulb:"
      alt="💡"
    /> Vielen Dank schonmal, ich werd versuchen das so gut wie möglich umzusetzen, ein paar fragen bleiben dennoch offen:</p>
<blockquote>
<p>Das Problem ist, das std::string intern mit einem Zeiger arbeitet um eine dynamische Stringlänge möglich zu machen</p>
</blockquote>
<p>Wie kann ich das umsetzen? würde eine char- Variable ihren Zweck erfüllen?</p>
<blockquote>
<p>usw. noch ein paar Kleinigkeiten sind falsch ...</p>
</blockquote>
<p>könntest du mir bitte die &quot;Kleinigkeiten&quot; verraten? Ich bin mir nicht sicher was du damit meinst <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=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1426082</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1426082</guid><dc:creator><![CDATA[double *T]]></dc:creator><pubDate>Tue, 25 Dec 2007 20:43:44 GMT</pubDate></item><item><title><![CDATA[Reply to segmentation fault - für anfänger? on Tue, 25 Dec 2007 20:49:56 GMT]]></title><description><![CDATA[<p>Würde die Typenumwandlung so funktionieren?:</p>
<pre><code>[cpp]char datei_read;
//[...]
    for(int j=1; j&lt;datei_read; j++)
       datei[j] = datei_read;[/cpp]
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1426084</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1426084</guid><dc:creator><![CDATA[double *T]]></dc:creator><pubDate>Tue, 25 Dec 2007 20:49:56 GMT</pubDate></item><item><title><![CDATA[Reply to segmentation fault - für anfänger? on Tue, 25 Dec 2007 21:31:40 GMT]]></title><description><![CDATA[<blockquote>
<p>Wie kann ich das umsetzen? würde eine char- Variable ihren Zweck erfüllen?</p>
</blockquote>
<p>Naja das Problem ist nicht einen char-Array zu lesen, sondern vielmehr, dass man wissen muss, wie lang der Array ist! Deswegen musst du die länge mitspeichern ...</p>
<pre><code class="language-cpp">quelle.close();

    if (!quelle)
       cout &lt;&lt; &quot;Dateierror&quot; &lt;&lt; &quot;\n--------------&quot; &lt;&lt; endl;
</code></pre>
<p>Hier ist eine der Kleinigkeiten. Du kontrollierst nicht ob die Datei geöffnet werden konnte, da du die Datei ja bereits geschlossen hast, sondern ob ein bad/fail-bit gesetzt ist. (D.h. wenn read fehlgeschlagen ist). Und dann solltest du, wenn schon die Datei nicht korrekt gelesen werden konnte auch mit return aus der Funktion springen und nicht einfach weiter einlesen (geht eh nicht mehr!)...</p>
<p>usw. noch ein paar Kleinigkeiten drin ^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1426099</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1426099</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Tue, 25 Dec 2007 21:31:40 GMT</pubDate></item><item><title><![CDATA[Reply to segmentation fault - für anfänger? on Tue, 25 Dec 2007 22:45:10 GMT]]></title><description><![CDATA[<p>Habs jetzt endlich zum laufen (und funktionieren) gebracht! Sin wohl noch grobe Macken drin, hab auch fast alle for- schleifen mal mit 1 definiert, wahrscheinlich hab ichs etwas zu kompliziert gemacht, aber wenigstens erfüllt das Programm jetzt seine Funktion <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="🙂"
    /> . Falls jemand noch einen Tipp oder sonstiges hat, nur zu <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 />
Ich poste einfach mal den Code:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;string&gt;
using namespace std;

int main()
{
    int woerter=0;
    int zeichen=0;
    int saetze=0;
    char datei_read;
    string datei;
    char zeichen_d[10000];

    fstream quelle;
    string quelldateiname;
    cout &lt;&lt; &quot;Quelldatei : &quot;;
    cin &gt;&gt; quelldateiname;

    // Datei öffnen, lesen, schließen
    quelle.open(quelldateiname.c_str(), ios::in);
    quelle.read(reinterpret_cast&lt;char*&gt;(&amp;datei_read), sizeof(datei_read));

    if (!quelle)
    {
       cout &lt;&lt; &quot;Dateierror&quot; &lt;&lt; &quot;\n--------------&quot; &lt;&lt; endl;
       return 0;
    }

    quelle.close();

    //Typenumwandlung von char in string
    for(int j=1; j&lt;datei_read; j++)
       datei_read = datei[j];

    //Typenumwandlung von string nach char[]
    for(int h=0; h &lt; datei.size(); h++)
       datei[h] = zeichen_d[h];

    for (int i=1; i&lt;9000; i++)
    {
          zeichen++;

          //vermeidet d. einlesen einer leerzeichen- Reihe
          while (zeichen_d[i] == zeichen_d[i++] &amp;&amp; zeichen_d[i++] == ' ')
          {
             i++;
          }
          if (datei[i] == ' ')
              woerter++;

          //fragt die anzahl d. punkte (Sätze) in der Datei ab, vermeidet einlesen von z.B. &quot;...&quot;
          while (zeichen_d[i] == zeichen_d[i++] &amp;&amp; zeichen_d[i++] == '.')
          {
             i++;
          }
          if (datei[i] == '.')
              saetze++;

    }

    cout &lt;&lt; &quot;Woerter    : &quot; &lt;&lt; woerter &lt;&lt; endl;
    cout &lt;&lt; &quot;Zeichen    : &quot; &lt;&lt; zeichen &lt;&lt; endl;
    cout &lt;&lt; &quot;Saetze     : &quot; &lt;&lt; saetze &lt;&lt; endl;
    system(&quot;pause&quot;);
}
</code></pre>
<p>Sind die vielen Typenumwandlungen eigentlich wirklich nötig?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1426118</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1426118</guid><dc:creator><![CDATA[double *T]]></dc:creator><pubDate>Tue, 25 Dec 2007 22:45:10 GMT</pubDate></item><item><title><![CDATA[Reply to segmentation fault - für anfänger? on Wed, 26 Dec 2007 10:23:55 GMT]]></title><description><![CDATA[<p>Sorry, aber dein Programm ist so auch noch voller Fehler.<br />
Du solltest dir noch mal ein C++ Tutorial von Anfang an durcharbeiten (insb. die Datentypen, z.B. Verwendung von std::string).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1426227</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1426227</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Wed, 26 Dec 2007 10:23:55 GMT</pubDate></item><item><title><![CDATA[Reply to segmentation fault - für anfänger? on Wed, 26 Dec 2007 11:18:15 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">//Typenumwandlung von char in string
    for(int j=1; j&lt;datei_read; j++)
       datei_read = datei[j];

    //Typenumwandlung von string nach char[]
    for(int h=0; h &lt; datei.size(); h++)
       datei[h] = zeichen_d[h];
</code></pre>
<p>was soll das bewirken? <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="😃"
    /> Davon mal abgesehen, dass es abstürzen müsste, da &quot;datei&quot; nicht wirklich so groß ist, dass du mit i &lt; datei_read dadrauf zugreifen kannst <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/1426245</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1426245</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Wed, 26 Dec 2007 11:18:15 GMT</pubDate></item><item><title><![CDATA[Reply to segmentation fault - für anfänger? on Wed, 26 Dec 2007 13:26:02 GMT]]></title><description><![CDATA[<p>Ja, ihr habt wahrscheinlich recht... werd mir noch mal das ein oder andere Tutorial ansehen müssen, trotzdem danke für die Hilfe <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>Ach ja @(D)Evil: in die Mitte und am Ende davon wollte ich eigentlich eine Kontrolle mit cout schreiben, weil ich mir nicht sicher war, ob man das so machen kann <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 />
Ich weiß... hab wirklich einige tut. nötig <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/1426298</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1426298</guid><dc:creator><![CDATA[double *T]]></dc:creator><pubDate>Wed, 26 Dec 2007 13:26:02 GMT</pubDate></item><item><title><![CDATA[Reply to segmentation fault - für anfänger? on Wed, 26 Dec 2007 21:46:26 GMT]]></title><description><![CDATA[<p>double *T schrieb:</p>
<blockquote>
<pre><code class="language-cpp">while (zeichen_d[i] == zeichen_d[i++] &amp;&amp; zeichen_d[i++] == ' ')
</code></pre>
</blockquote>
<p>Ist das nicht undefined behaviour? Zwischen zwei Sequenzpunkten darf eine Variable, die verändert wird doch nur verwendet werden, um den neuen Wert festzustellen und sonst für nichts...</p>
<p><a href="http://www.angelikalanger.com/Articles/VSJ/SequencePoints/SequencePoints.html" rel="nofollow">http://www.angelikalanger.com/Articles/VSJ/SequencePoints/SequencePoints.html</a></p>
<blockquote>
<p>The crux is that in the expression zeichen_d[i] == zeichen_d[i++] there are two accesses to variable i and one of the accesses, namely the i++, is a modifying access. Since the order of evaluation between sequence points is not defined we do not know whether i will be modified before it will be read or whether it will be read before the modification.</p>
</blockquote>
<p>Felix :xmas1: :xmas2:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1426511</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1426511</guid><dc:creator><![CDATA[Phoemuex]]></dc:creator><pubDate>Wed, 26 Dec 2007 21:46:26 GMT</pubDate></item></channel></rss>