<?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[Warum erhalte ich ein Segmentation fault?]]></title><description><![CDATA[<p>Ich bekomme hier beim Zusammenfügen von 2 Char Arrays in einer Funktion einen Segmentation fault.<br />
Sowohl Variante 1 als auch Variante 2 funktionieren nicht, siehe Quellcode.</p>
<p>Warum ist das so?</p>
<p>PS: Ich möchte klassische C Char Arrays verwenden, also keine String Funktionen von C++, da das ganze Progamm bald auf C umgemoddelt werden soll, sobald es mal funktioniert.</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;string&gt;

using namespace std;

int mounte(char *pw)
{
  char command[] = &quot;sudo truecrypt testfile.tc tc --password=\&quot;&quot;;
  char command_rest[] = &quot;\&quot; --non-interactive&quot;;

  cout &lt;&lt; pw &lt;&lt; endl;

  /* Variante 1 
     So war es am Anfang, das wirft sofort einen Segmentation fault
     nach dem 2. strcat Kommando: /*
  /*
  strcat (command, pw);
  strcat (command, command_rest); /* Das letzte Char Array sollte dem ersten
                                     angefuegt werden. */
  */

  /* Variante 2
     Da Variante 1 nicht funktionierte, dachte ich, ich bin schlau
     und habe einfach zuerst den command_rest char array dem pw char array
     angefügt um dann erst im zweiten Schritt das pw char array dem
     command char array hinzuzufuegen, aber das geht auch nicht:
     Diesmal bekomme ich aber keinen Segmentation Fault, sondern einen  
     Backtrace.
  */
  strcat (pw, command_rest);
  strcat (command, command_rest);

  /* Hier geht es jetzt normal weiter, aber da obiges
     nicht funktioneirt habe ich das mal ausgeklammert. */
  /*
  cout &lt;&lt; &quot;Befehl: &quot; &lt;&lt; endl &lt;&lt; command &lt;&lt; endl; 

  if (system(command) == true)
  {
    cerr &lt;&lt; &quot;Alles ok. &quot; &lt;&lt; endl;
  }
  else
  {
    cerr &lt;&lt; &quot;Nichts ist ok. &quot; &lt;&lt; endl;
  }
  */
  return 0;

}

int main()
{
  char pw_false [] = &quot;fdklksdlf123456&quot;;
  char pw_correct [] = &quot;shjdfghherffdf4234&quot;;  

  cout &lt;&lt; pw_false &lt;&lt; endl;
  mounte(pw_false);

  return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/225515/warum-erhalte-ich-ein-segmentation-fault</link><generator>RSS for Node</generator><lastBuildDate>Thu, 01 Oct 2026 09:29:21 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/225515.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 23 Oct 2008 22:19:05 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Warum erhalte ich ein Segmentation fault? on Thu, 23 Oct 2008 22:19:05 GMT]]></title><description><![CDATA[<p>Ich bekomme hier beim Zusammenfügen von 2 Char Arrays in einer Funktion einen Segmentation fault.<br />
Sowohl Variante 1 als auch Variante 2 funktionieren nicht, siehe Quellcode.</p>
<p>Warum ist das so?</p>
<p>PS: Ich möchte klassische C Char Arrays verwenden, also keine String Funktionen von C++, da das ganze Progamm bald auf C umgemoddelt werden soll, sobald es mal funktioniert.</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;string&gt;

using namespace std;

int mounte(char *pw)
{
  char command[] = &quot;sudo truecrypt testfile.tc tc --password=\&quot;&quot;;
  char command_rest[] = &quot;\&quot; --non-interactive&quot;;

  cout &lt;&lt; pw &lt;&lt; endl;

  /* Variante 1 
     So war es am Anfang, das wirft sofort einen Segmentation fault
     nach dem 2. strcat Kommando: /*
  /*
  strcat (command, pw);
  strcat (command, command_rest); /* Das letzte Char Array sollte dem ersten
                                     angefuegt werden. */
  */

  /* Variante 2
     Da Variante 1 nicht funktionierte, dachte ich, ich bin schlau
     und habe einfach zuerst den command_rest char array dem pw char array
     angefügt um dann erst im zweiten Schritt das pw char array dem
     command char array hinzuzufuegen, aber das geht auch nicht:
     Diesmal bekomme ich aber keinen Segmentation Fault, sondern einen  
     Backtrace.
  */
  strcat (pw, command_rest);
  strcat (command, command_rest);

  /* Hier geht es jetzt normal weiter, aber da obiges
     nicht funktioneirt habe ich das mal ausgeklammert. */
  /*
  cout &lt;&lt; &quot;Befehl: &quot; &lt;&lt; endl &lt;&lt; command &lt;&lt; endl; 

  if (system(command) == true)
  {
    cerr &lt;&lt; &quot;Alles ok. &quot; &lt;&lt; endl;
  }
  else
  {
    cerr &lt;&lt; &quot;Nichts ist ok. &quot; &lt;&lt; endl;
  }
  */
  return 0;

}

int main()
{
  char pw_false [] = &quot;fdklksdlf123456&quot;;
  char pw_correct [] = &quot;shjdfghherffdf4234&quot;;  

  cout &lt;&lt; pw_false &lt;&lt; endl;
  mounte(pw_false);

  return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1603722</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1603722</guid><dc:creator><![CDATA[Problem]]></dc:creator><pubDate>Thu, 23 Oct 2008 22:19:05 GMT</pubDate></item><item><title><![CDATA[Reply to Warum erhalte ich ein Segmentation fault? on Fri, 24 Oct 2008 00:33:03 GMT]]></title><description><![CDATA[<p>Das Problem ist, dass sowohl command als auch command_rest vom Compiler genau so lang gemacht werden, dass die stringliterale inlusive abschließendem '\0' aufgenommen werden können. Mit strcat schreibst du aber in den Speicher dahinter (der dir garnicht gehört). Lösung ist also dir einen Char-Buffer zu erstellen der groß genug ist und in den du dann alles nacheinander rein strcat-est. Längenchecks dabei nicht vergessen.</p>
<p><a href="http://www.cplusplus.com/reference/clibrary/cstring/strcat.html" rel="nofollow">http://www.cplusplus.com/reference/clibrary/cstring/strcat.html</a></p>
<p>Was mich wundert ist, dass du strcat überhaupt verwenden kannst, obwohl du &lt;cstring&gt; nicht eingebunden hast.</p>
<p>Im übrigen solltest du gleich mit C anfangen wenn das Programm später in C geschrieben sein soll - das erst als halb-C-Programm unter nem C++ Compiler zum Laufen zu bringen und dann nochmal umzustricken für C halte ich nicht für besonders sinnvoll.</p>
<p>Zu allerletzt sei noch auf das C-Unterforum verwiesen, wo dir auf solche C-Fragen vermutlich schneller geantwortet wird (und wo du vor &quot;benutz einfach C++ und std::string&quot;-Tips sicher bist).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1603792</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1603792</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 24 Oct 2008 00:33:03 GMT</pubDate></item><item><title><![CDATA[Reply to Warum erhalte ich ein Segmentation fault? on Fri, 24 Oct 2008 01:48:28 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Das Problem ist, dass sowohl command als auch command_rest vom Compiler genau so lang gemacht werden, dass die stringliterale inlusive abschließendem '\0' aufgenommen werden können. Mit strcat schreibst du aber in den Speicher dahinter (der dir garnicht gehört). Lösung ist also dir einen Char-Buffer zu erstellen der groß genug ist und in den du dann alles nacheinander rein strcat-est. Längenchecks dabei nicht vergessen.</p>
<p><a href="http://www.cplusplus.com/reference/clibrary/cstring/strcat.html" rel="nofollow">http://www.cplusplus.com/reference/clibrary/cstring/strcat.html</a></p>
</blockquote>
<p>Vielen Dank.<br />
Mit dem Char Buffer und Längencheck funktioniert es jetzt.</p>
<p>Aber jetzt habe ich eine weitere Frage.</p>
<p>sizeof(pw);<br />
liefert mir ja jetzt nur die Größe eines Zeigers,<br />
was auf meinem 32 Bit OS genau 4 Bytes wären.</p>
<p>D.h. mein String Kommando ist im Prinzip größer als mein derzeitiger<br />
Char Buffer, da für den Pointers nur 4 Byte gezählt werden, anstatt<br />
ein paar mehr für den Dateninhalt des Pointers.</p>
<p>Wie bestimme ich nun die Größe des Dateninhalts auf den ein Pointer zeigt korrekt?<br />
Ich dachte mir, daß ich die Größe des Strings beim Funktionsaufruf ja mitübergeben könnte.<br />
Z.b. so</p>
<pre><code>main{
  ...
  char pwfalse[] = &quot;12345&quot;;
  mounte(pw_false, sizeof(pw_false);
  ...
</code></pre>
<p>Aber dann muß ich 2 Werte übergeben und brauche auf der Funktionsseite auch<br />
noch eine Variable die den Wert aufnimmt.</p>
<p>Wie ist hier eigentlich die professionelle Vorgehensweise?</p>
<p>Was ich meine, geht das irgendwie eleganter?<br />
Also kann ich innerhalb der Funktion die Größe des Strings auf den mein Pointer zeigt irgendwie bestimmen?</p>
<blockquote>
<p>Was mich wundert ist, dass du strcat überhaupt verwenden kannst, obwohl du &lt;cstring&gt; nicht eingebunden hast.</p>
</blockquote>
<p>Eventuell liegt es an dem C++<br />
#include &lt;string&gt;</p>
<blockquote>
<p>Im übrigen solltest du gleich mit C anfangen wenn das Programm später in C geschrieben sein soll - das erst als halb-C-Programm unter nem C++ Compiler zum Laufen zu bringen und dann nochmal umzustricken für C halte ich nicht für besonders sinnvoll.</p>
</blockquote>
<p>Ja, du hast schon recht, nur finde ich daß cout weniger Tipparbeit bedeutet<br />
als printf bzw. schneller von der Hand geht um mal schnell etwas zu testen<br />
und mir ja auch noch ein paar weitere C++ Features für temporäre Tests zur Verfügung stehen.<br />
Deswegen habe ich bisher so einen C/C++ Mischmasch verwendet.<br />
Aber ich werde das im späteren Verlauf ja noch alles bereinigen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1603823</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1603823</guid><dc:creator><![CDATA[Problem]]></dc:creator><pubDate>Fri, 24 Oct 2008 01:48:28 GMT</pubDate></item><item><title><![CDATA[Reply to Warum erhalte ich ein Segmentation fault? on Fri, 24 Oct 2008 05:58:46 GMT]]></title><description><![CDATA[<p>Nunja, der Pointer selbst beinhaltet nur eine Adresse und damit nicht die Information auf wieviel Dateninhalt er zeigen soll. Über den Typ des pointers weiß der compiler aber auf wieviel Speicher er zeigt. Ein char* zeigt eben auf einen char. Diese Information suchst du aber garnicht. Dein char* zeigt nicht nur auf einen char sondern auf ein array aus chars. Davon hat der compiler nun keine Ahnung. Deshalb werden c strings (also char arrays) mit dem Zeichen '\0' abgeschlossen. Um die Länge zu ermitteln läuft man Zeichen für Zeichen ab und sucht nach dieser '\0'. Dafür gibts natürlich bereits eine Funktion, die nennt sich strlen(). Beachte, wenn du deinen buffer anlegst, Platz für die '\0' am Ende einzuplanen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1603942</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1603942</guid><dc:creator><![CDATA[HyperSonic]]></dc:creator><pubDate>Fri, 24 Oct 2008 05:58:46 GMT</pubDate></item><item><title><![CDATA[Reply to Warum erhalte ich ein Segmentation fault? on Fri, 24 Oct 2008 06:33:52 GMT]]></title><description><![CDATA[<p>Problem schrieb:</p>
<blockquote>
<p>......da das ganze Progamm bald auf C umgemoddelt werden soll, sobald es mal funktioniert....</p>
</blockquote>
<p>Nur mal aus Interesse: Warum das?</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1603963</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1603963</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Fri, 24 Oct 2008 06:33:52 GMT</pubDate></item><item><title><![CDATA[Reply to Warum erhalte ich ein Segmentation fault? on Fri, 24 Oct 2008 07:40:30 GMT]]></title><description><![CDATA[<p>Problem schrieb:</p>
<blockquote>
<p>Wie bestimme ich nun die Größe des Dateninhalts auf den ein Pointer zeigt korrekt?</p>
</blockquote>
<p>mit strlen() (wie schon von HyperSonic geschrieben wurde)</p>
<blockquote>
<p>Ich dachte mir, daß ich die Größe des Strings beim Funktionsaufruf ja mitübergeben könnte.</p>
</blockquote>
<p>Bei C-Strings machst du das indirekt durch den terminierenden '\0'-Character. Du kannst die Länge also innerhalb der Funktion bestimmen. Bei normalen Arrays gibts das allerding nicht.</p>
<blockquote>
<p>Was ich meine, geht das irgendwie eleganter?</p>
</blockquote>
<p>Jap. Mit C++ *SCNR*</p>
<blockquote>
<p>Ja, du hast schon recht, nur finde ich daß cout weniger Tipparbeit bedeutet<br />
als printf bzw. schneller von der Hand geht um mal schnell etwas zu testen<br />
und mir ja auch noch ein paar weitere C++ Features für temporäre Tests zur Verfügung stehen.<br />
Deswegen habe ich bisher so einen C/C++ Mischmasch verwendet.<br />
Aber ich werde das im späteren Verlauf ja noch alles bereinigen.</p>
</blockquote>
<p>Es gibt noch einiges mehr was weniger Tipparbeit, weniger Kopfzerbrechen und mehr Sicherheit bereitet in C++. Z.B. die Stringübergabe, -länge und -verknüpfung. Warum du in C arbeiten willst ist mir ehrlich gesagt schleierhaft.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1604015</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1604015</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 24 Oct 2008 07:40:30 GMT</pubDate></item><item><title><![CDATA[Reply to Warum erhalte ich ein Segmentation fault? on Fri, 24 Oct 2008 12:46:10 GMT]]></title><description><![CDATA[<p>HyperSonic schrieb:</p>
<blockquote>
<p>Dafür gibts natürlich bereits eine Funktion, die nennt sich strlen().</p>
</blockquote>
<p>Das ist super, danke.</p>
<blockquote>
<p>Beachte, wenn du deinen buffer anlegst, Platz für die '\0' am Ende einzuplanen!</p>
</blockquote>
<p>Ja, das ist mir gestern Nacht auch schon aufgefallen, zumal alle Char arrays deren Größe die mit sizeof berechnet werden um genau 1 Byte wegen der Nullterminierung größer sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1604170</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1604170</guid><dc:creator><![CDATA[Problem]]></dc:creator><pubDate>Fri, 24 Oct 2008 12:46:10 GMT</pubDate></item><item><title><![CDATA[Reply to Warum erhalte ich ein Segmentation fault? on Fri, 24 Oct 2008 12:47:17 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>Problem schrieb:</p>
<blockquote>
<p>......da das ganze Progamm bald auf C umgemoddelt werden soll, sobald es mal funktioniert....</p>
</blockquote>
<p>Nur mal aus Interesse: Warum das?</p>
<p>Gruß,</p>
<p>Simon2.</p>
</blockquote>
<p>Das hat ganz einfache Gründe, ich muß demnächst ein paar kleine Projekte in C realisieren und wollte daher schonmal sanft anfangen mich etwas in C einzuarbeiten bzw. mal sporadisches Wissen von früher wieder zu erneuern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1604171</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1604171</guid><dc:creator><![CDATA[Problem]]></dc:creator><pubDate>Fri, 24 Oct 2008 12:47:17 GMT</pubDate></item></channel></rss>