<?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[char Array Verständnisproblem]]></title><description><![CDATA[<p>Hallo.</p>
<p>ich habe hier ein Problem mit char-Arrays. Liegt vermutlich daran, dass ich es nicht verstehe, wie diese funktionieren.</p>
<p>Ich möchte diese Funktion verwenden: <code>int execv(const char *path, char *const argv[])</code></p>
<p>Mein Problem liegt darin, das ich den Datentyp <code>char* const argv[]</code> nicht erstellt bekomme. Meine Frage ist also vorweg, was ist das überhaupt und wo ist der Unterschied zu <code>const char *path</code> ?</p>
<p>Aufbau von <code>const char*</code></p>
<pre><code class="language-cpp">std::string foo = &quot;Hello&quot;;
const char* bar = foo.c_str();
</code></pre>
<p><code>bar</code> ist intern dann folgendermaßen aufgebaut.</p>
<pre><code class="language-cpp">bar[0] = 'H';
bar[1] = 'e';
bar[2] = 'l';
bar[3] = 'l';
bar[4] = 'o';
bar[5] = '\n;
</code></pre>
<p>Soweit habe ich das kapiert. Was mich etwas verwirrt ist, wo ist da der Pointer? <code>char*</code> ist ja ein Pointer auf char. Somit wäre <code>const char*</code> ein Konstanter Pointer auf <code>char</code> , Was bedeutet das die Speicheradresse nicht verändert werden kann.<br />
<code>char* const argv[]</code> wäre ein <code>char</code> Pointer auf ein Konstantes <code>char</code> Array. Aber bar aus dem obigen Beispiel ist ja auch ein Array. Also ist <code>char*</code> immer ein Array?</p>
<p>Ihr seht ich raffe es nicht.</p>
<p>Das folgende Problem, was auch eine Compilermeldung wirft, kann ich leider nicht lösen, weil mir einfach das obige Wissen fehlt.</p>
<pre><code class="language-cpp">std::string param = &quot;--version&quot;;
char *argv = new char[param.size() + 1];
argv[param.size()] = '\0';
strcpy(argv, param.c_str());

int status = execv(&quot;ls&quot;, argv);
</code></pre>
<blockquote>
<p>cannot convert 'char* const' to 'char* const*' for argument '2' to 'int execv(const char*, char* const*)'</p>
</blockquote>
<p>Von <code>const char*</code> und Konsorten scheint es irgendwie undendlich viele Varianten zu geben und ich habe hier gänzlich den Überblick verloren.</p>
<p>Über einige Tipps wäre ich dankbar.</p>
<p>Grüße.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/307983/char-array-verständnisproblem</link><generator>RSS for Node</generator><lastBuildDate>Thu, 06 Aug 2026 05:19:41 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/307983.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 11 Sep 2012 12:29:37 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to char Array Verständnisproblem on Tue, 11 Sep 2012 12:29:37 GMT]]></title><description><![CDATA[<p>Hallo.</p>
<p>ich habe hier ein Problem mit char-Arrays. Liegt vermutlich daran, dass ich es nicht verstehe, wie diese funktionieren.</p>
<p>Ich möchte diese Funktion verwenden: <code>int execv(const char *path, char *const argv[])</code></p>
<p>Mein Problem liegt darin, das ich den Datentyp <code>char* const argv[]</code> nicht erstellt bekomme. Meine Frage ist also vorweg, was ist das überhaupt und wo ist der Unterschied zu <code>const char *path</code> ?</p>
<p>Aufbau von <code>const char*</code></p>
<pre><code class="language-cpp">std::string foo = &quot;Hello&quot;;
const char* bar = foo.c_str();
</code></pre>
<p><code>bar</code> ist intern dann folgendermaßen aufgebaut.</p>
<pre><code class="language-cpp">bar[0] = 'H';
bar[1] = 'e';
bar[2] = 'l';
bar[3] = 'l';
bar[4] = 'o';
bar[5] = '\n;
</code></pre>
<p>Soweit habe ich das kapiert. Was mich etwas verwirrt ist, wo ist da der Pointer? <code>char*</code> ist ja ein Pointer auf char. Somit wäre <code>const char*</code> ein Konstanter Pointer auf <code>char</code> , Was bedeutet das die Speicheradresse nicht verändert werden kann.<br />
<code>char* const argv[]</code> wäre ein <code>char</code> Pointer auf ein Konstantes <code>char</code> Array. Aber bar aus dem obigen Beispiel ist ja auch ein Array. Also ist <code>char*</code> immer ein Array?</p>
<p>Ihr seht ich raffe es nicht.</p>
<p>Das folgende Problem, was auch eine Compilermeldung wirft, kann ich leider nicht lösen, weil mir einfach das obige Wissen fehlt.</p>
<pre><code class="language-cpp">std::string param = &quot;--version&quot;;
char *argv = new char[param.size() + 1];
argv[param.size()] = '\0';
strcpy(argv, param.c_str());

int status = execv(&quot;ls&quot;, argv);
</code></pre>
<blockquote>
<p>cannot convert 'char* const' to 'char* const*' for argument '2' to 'int execv(const char*, char* const*)'</p>
</blockquote>
<p>Von <code>const char*</code> und Konsorten scheint es irgendwie undendlich viele Varianten zu geben und ich habe hier gänzlich den Überblick verloren.</p>
<p>Über einige Tipps wäre ich dankbar.</p>
<p>Grüße.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2250261</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2250261</guid><dc:creator><![CDATA[create_problem]]></dc:creator><pubDate>Tue, 11 Sep 2012 12:29:37 GMT</pubDate></item><item><title><![CDATA[Reply to char Array Verständnisproblem on Tue, 11 Sep 2012 12:40:37 GMT]]></title><description><![CDATA[<p>create_problem schrieb:</p>
<blockquote>
<p><code>char* const argv[]</code> wäre ein <code>char</code> Pointer auf ein Konstantes <code>char</code> Array.</p>
</blockquote>
<p>Nee, das ist ein Array von konstanten Pointern, die auf char zeigen. Etwa so:</p>
<p>char * const bla[] = {&quot;Eins&quot;, &quot;Zwei&quot;, &quot;Drei&quot;};</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2250265</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2250265</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Tue, 11 Sep 2012 12:40:37 GMT</pubDate></item><item><title><![CDATA[Reply to char Array Verständnisproblem on Tue, 11 Sep 2012 12:53:54 GMT]]></title><description><![CDATA[<p>Belli schrieb:</p>
<blockquote>
<p>Etwa so:</p>
<p>char * const bla[] = {&quot;Eins&quot;, &quot;Zwei&quot;, &quot;Drei&quot;};</p>
</blockquote>
<p>In diesem Fall (für execv) muss es am Ende ein NULL-Pointer sein:</p>
<pre><code class="language-cpp">char * const bla[] = {&quot;Eins&quot;, &quot;Zwei&quot;, &quot;Drei&quot;, NULL};
</code></pre>
<p>@create_problem</p>
<p>Du kannst auch mal bei <a href="http://www.cdecl.org" rel="nofollow">www.cdecl.org</a> deine Definition eingeben und dir das ins englische übersetzen lassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2250269</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2250269</guid><dc:creator><![CDATA[DirkB]]></dc:creator><pubDate>Tue, 11 Sep 2012 12:53:54 GMT</pubDate></item><item><title><![CDATA[Reply to char Array Verständnisproblem on Tue, 11 Sep 2012 14:17:41 GMT]]></title><description><![CDATA[<p>create_problem schrieb:</p>
<blockquote>
<p>Mein Problem liegt darin, das ich den Datentyp <code>char* const argv[]</code> nicht erstellt bekomme. Meine Frage ist also vorweg, was ist das überhaupt und wo ist der Unterschied zu <code>const char *path</code> ?</p>
</blockquote>
<p>Wurde ja schon erklärt, wo der Unterschied zwischen<br />
char*const* und<br />
const char* liegt.</p>
<p>create_problem schrieb:</p>
<blockquote>
<p>Aufbau von <code>const char*</code></p>
<pre><code class="language-cpp">std::string foo = &quot;Hello&quot;;
const char* bar = foo.c_str();
</code></pre>
<p><code>bar</code> ist intern dann folgendermaßen aufgebaut.</p>
<pre><code class="language-cpp">bar[0] = 'H';
bar[1] = 'e';
bar[2] = 'l';
bar[3] = 'l';
bar[4] = 'o';
bar[5] = '\n;
</code></pre>
</blockquote>
<p>bar ist ein Zeiger, der &quot;intern&quot; eine Adresse speichert -- und zwar die Adresse des ersten Zeichens, was irgendwo im Speicher steht. In diesem Fall ist es ein Speicherbereich, um den sich das string-Objekt foo kümmert (und irgendwann von foo wieder freigegeben wird). Für die Ende-Markierung kommt auch kein '\n' sondern ein '\0' zum Einsatz, der Nullterminator.</p>
<p>create_problem schrieb:</p>
<blockquote>
<p>Soweit habe ich das kapiert. Was mich etwas verwirrt ist, wo ist da der Pointer? <code>char*</code> ist ja ein Pointer auf char. Somit wäre <code>const char*</code> ein Konstanter Pointer auf <code>char</code> , Was bedeutet das die Speicheradresse nicht verändert werden kann.</p>
</blockquote>
<p>Nein. Das const an der Stelle bezieht sich auf das, worauf der Zeiger zeigt. Wenn du eine Variable des Typs <code>const char*</code> anlegst, ist das eine Zeigervariable, deren Adresse du verändern kannst. Du kannst diese Zeigervariable nur nicht ohne weiteres dazu verwenden, das zu verändern, wodrauf der Zeiger zeigt.</p>
<p>create_problem schrieb:</p>
<blockquote>
<p><code>char* const argv[]</code> wäre ein <code>char</code> Pointer auf ein Konstantes <code>char</code> Array. Aber bar aus dem obigen Beispiel ist ja auch ein Array. Also ist <code>char*</code> immer ein Array?</p>
</blockquote>
<p>Nö. Die Deklaration sagt &quot;argv ist ein Array (unbekannter Größe) von unveränderlichen Zeigern auf veränderliche Zeichen.&quot; Allerdings kann man Arrays gar nicht an Funktionen übergeben oder zurück geben, wie man es beispielsweise bei int-Werten machen würde. Schreibst du das als Funktionsparameter auf, geht der Compiler hin und macht daraus in Wirklichkeit <code>char*const*argv</code> . argv ist also nur ein Zeiger.</p>
<p>create_problem schrieb:</p>
<blockquote>
<p>Ihr seht ich raffe es nicht.</p>
</blockquote>
<p>Die Deklarationssyntax ist halt einfach Sch.....<br />
Das wird schon. <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>create_problem schrieb:</p>
<blockquote>
<p>Das folgende Problem, was auch eine Compilermeldung wirft, kann ich leider nicht lösen, weil mir einfach das obige Wissen fehlt.</p>
<pre><code class="language-cpp">std::string param = &quot;--version&quot;;
char *argv = new char[param.size() + 1];
argv[param.size()] = '\0';
strcpy(argv, param.c_str());
int status = execv(&quot;ls&quot;, argv);
</code></pre>
<blockquote>
<p>cannot convert 'char* const' to 'char* const*' for argument '2' to 'int execv(const char*, char* const*)'</p>
</blockquote>
</blockquote>
<p>Wo er Recht hat, hat er Recht. Die Typen passen nicht zueinander. Das eine ist ein Zeiger auf char, das andere ein Zeiger auf Zeiger auf char. Was ich komisch finde ist, dass die Funktion die Zeichenketten ändern konnen will; denn sonst wäre da noch ein const mehr dabei. Aber in der Dokumentation zu execv finde ich keine Info, dass die Zeichenketten wirklich verändert werden. Da hat also jemand leider ein &quot;const&quot; vergessen. Probier es mal so:</p>
<pre><code class="language-cpp">std::string param = &quot;--version&quot;;
char*const args[] = {
    const_cast&lt;char*&gt;(param.c_str()),
    0 }; // Auch dieses Array muss nullterminiert sein, sagt die Doku!
int status = execv(&quot;ls&quot;, args);
</code></pre>
<p>Und wenn execv doch irgendwie die Zeichenketten ändern will, dann dürfen wir hier kein const_cast verwenden. Dann müsste man die Zeichen in einen temporären Puffer umkopieren, z.B. in einen Vector.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2250311</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2250311</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 11 Sep 2012 14:17:41 GMT</pubDate></item><item><title><![CDATA[Reply to char Array Verständnisproblem on Tue, 11 Sep 2012 19:21:06 GMT]]></title><description><![CDATA[<p>Hallo.</p>
<p>Danke für Eure ausführlich Erklärung. Ich glaube, das ich es jetzt kapiert habe, aber das werde ich schnell genug rausfinden :-).</p>
<p>Eine kleine Frage hätte ich noch zur Null-Terminierung. Ist das egal ob ich <code>'\0'</code> oder <code>0</code> oder <code>NULL</code> schreibe, oder gibt es da auch besondere Unterschiede?</p>
<p>Grüße.</p>
<p>PS: Der Link: <a href="http://www.cdecl.org" rel="nofollow">http://www.cdecl.org</a> ist wirklich super.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2250443</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2250443</guid><dc:creator><![CDATA[create_problem]]></dc:creator><pubDate>Tue, 11 Sep 2012 19:21:06 GMT</pubDate></item><item><title><![CDATA[Reply to char Array Verständnisproblem on Tue, 11 Sep 2012 19:26:56 GMT]]></title><description><![CDATA[<p>'\0' ist ein char mit Wert 0, 0 ist ein int mit Wert 0, NULL ist irgendein C-Makro, welches wer weiß wie definiert ist und eher für Nullzeiger verwendet werden sollte (aber nur in C, in C++ nimm dafür lieber 0 oder noch besser den neuen null_ptr). Der Unterschied zwischen char und int kann zum Beispiel von Bedeutung sein, wenn es um das Auflösen von Templateparametern geht. Ansonsten sind Integerwerte (auch char ist eine Art Integer) implizit ineinander konvertierbar.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2250446</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2250446</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 11 Sep 2012 19:26:56 GMT</pubDate></item></channel></rss>