<?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[Birgt das Gefahren?]]></title><description><![CDATA[<p>Hallo</p>
<p>Ich habe eine eigene Variante einer varible argument list ausprobiert. Ist dieser Code sicher?</p>
<pre><code class="language-cpp">void PrintStrs(int n, char *str, ...)
{
	char **p = &amp;str;

	for(int i = 0; i &lt; n; ++i)
	{
		std::cout &lt;&lt; *p &lt;&lt; std::endl;
		p += sizeof(char);
	}
}

int main()
{
    using namespace std;

	PrintStrs(2, &quot;hallo&quot;, &quot;welt&quot;);

    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/207933/birgt-das-gefahren</link><generator>RSS for Node</generator><lastBuildDate>Sun, 11 Oct 2026 10:57:47 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/207933.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 12 Mar 2008 20:52:13 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Birgt das Gefahren? on Wed, 12 Mar 2008 20:52:13 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Ich habe eine eigene Variante einer varible argument list ausprobiert. Ist dieser Code sicher?</p>
<pre><code class="language-cpp">void PrintStrs(int n, char *str, ...)
{
	char **p = &amp;str;

	for(int i = 0; i &lt; n; ++i)
	{
		std::cout &lt;&lt; *p &lt;&lt; std::endl;
		p += sizeof(char);
	}
}

int main()
{
    using namespace std;

	PrintStrs(2, &quot;hallo&quot;, &quot;welt&quot;);

    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1473266</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1473266</guid><dc:creator><![CDATA[__Stefan__]]></dc:creator><pubDate>Wed, 12 Mar 2008 20:52:13 GMT</pubDate></item><item><title><![CDATA[Reply to Birgt das Gefahren? on Wed, 12 Mar 2008 21:10:00 GMT]]></title><description><![CDATA[<p><strong>Stefan</strong> schrieb:</p>
<blockquote>
<p>Hallo</p>
<p>Ich habe eine eigene Variante einer varible argument list ausprobiert. Ist dieser Code sicher?</p>
</blockquote>
<p>Reicht Dir das hier als Antwort?</p>
<pre><code class="language-cpp">PrintStrs(3, &quot;Hallo&quot;, &quot;Peng.&quot;);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1473285</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1473285</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Wed, 12 Mar 2008 21:10:00 GMT</pubDate></item><item><title><![CDATA[Reply to Birgt das Gefahren? on Wed, 12 Mar 2008 21:15:51 GMT]]></title><description><![CDATA[<p>soweit ich weiß, ist die einzig sichere form, hier <code>va_list</code> und freunde zu verwenden.</p>
<pre><code class="language-cpp">void PrintStrs (int n, char const* str, ...)
{
   va_list args;
   va_start (args, str);

   char const* next = str;
   for (int i = 0; i &lt; n; ++i)
   {
      cout &lt;&lt; next &lt;&lt; endl;
      next = va_arg(args, char const*);
   }

   va_end (args);
}
</code></pre>
<p>ob das intern ähnlich wie du arbeitest, ist nicht spezifiziert (wozu auch?)</p>
<p>/edit: jetzt hätte ich fast vergessen, zu erwähnen, dass es auch mit <code>va_lists</code> nicht unbedingt sicher wird.</p>
<pre><code class="language-cpp">printStrs(3, &quot;eins, zwei, drei&quot;, 4, &quot;... ups&quot;);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1473294</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1473294</guid><dc:creator><![CDATA[queer_boy]]></dc:creator><pubDate>Wed, 12 Mar 2008 21:15:51 GMT</pubDate></item><item><title><![CDATA[Reply to Birgt das Gefahren? on Wed, 12 Mar 2008 21:22:47 GMT]]></title><description><![CDATA[<p>Also ich weiss ja nicht, wie ihr das seht, aber sollte man nicht eher auf variable Listen verzicheten und eher auf vectore usw. setzen?</p>
<p>Das geht ja relativ einfach und ist auch sicherer.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1473317</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1473317</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Wed, 12 Mar 2008 21:22:47 GMT</pubDate></item><item><title><![CDATA[Reply to Birgt das Gefahren? on Wed, 12 Mar 2008 21:24:57 GMT]]></title><description><![CDATA[<p>Ich meine, ist es zumindest so sicher wie printf()? Der Kern meiner Frage war eigentlich, ob die Methode auf die Variablen Argumente zuzugreifen sicher ist, oder ob Gefahr besteht, auf eine verbotene Speicheradresse zuzugreifen.<br />
Ich kann mir eben die offizielle Methode schlecht merken.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1473321</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1473321</guid><dc:creator><![CDATA[__Stefan__]]></dc:creator><pubDate>Wed, 12 Mar 2008 21:24:57 GMT</pubDate></item><item><title><![CDATA[Reply to Birgt das Gefahren? on Wed, 12 Mar 2008 22:24:52 GMT]]></title><description><![CDATA[<p>deine methode funktioniert nur dann sicher, wenn</p>
<pre><code class="language-cpp">p += sizeof(char);
</code></pre>
<p>auch tatsächlich auf das nächste funktionsargument zeigt.</p>
<p>übrigens ist das eine sehr hässliche art und weise, um <code>p++</code> zu schreiben. du inkrementierst den zeiger um eins, er zeigt aber dann auf eine adresse um sizeof(char*) weiter vorne (also idR um 4 bytes weiter).</p>
<p>also: nein, nein, nein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1473360</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1473360</guid><dc:creator><![CDATA[queer_boy]]></dc:creator><pubDate>Wed, 12 Mar 2008 22:24:52 GMT</pubDate></item><item><title><![CDATA[Reply to Birgt das Gefahren? on Thu, 13 Mar 2008 08:35:53 GMT]]></title><description><![CDATA[<p><strong>Stefan</strong> schrieb:</p>
<blockquote>
<p>Ich meine, ist es zumindest so sicher wie printf()? ...</p>
</blockquote>
<p>Da Du mindestens eine Fehlerquelle mehr hast als printf (s.a. Konrads Post), KANN es nicht &quot;so sicher wie printf&quot; (das übrigens auch sehr unsicher ist) sein ... schon gar nicht &quot;mindestens&quot;.</p>
<p><strong>Stefan</strong> schrieb:</p>
<blockquote>
<p>...Der Kern meiner Frage war eigentlich, ob die Methode auf die Variablen Argumente zuzugreifen sicher ist, oder ob Gefahr besteht, auf eine verbotene Speicheradresse zuzugreifen....</p>
</blockquote>
<p>Definitiv letzteres.<br />
Nochmal: warum übergibst Du nicht einfach einen vector (bzw. eine Referenz darauf) ?<br />
Funktioniert auch nicht anders, ist aber sicher in all den o.g. und weiteren Belangen.<br />
Schonmal nachgedacht, was passiert, wenn der Aufrufer Folgendes macht:</p>
<pre><code class="language-cpp">myClass peng;
PrintStrs(2, &quot;Hallo&quot;, &amp;peng);
</code></pre>
<p>?<br />
Bedenke bitte, dass (zumindest in C++) ein Design nur dann als &quot;sicher&quot; gilt, wenn der Benutzer keine Möglichkeit hat, für ihn unerwartetes Verhalten zu produzieren. ... und zwar nicht nur derjenige, der gerade gestern die Funktion selbst geschrieben hat, sondern auch wildfremde.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1473433</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1473433</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Thu, 13 Mar 2008 08:35:53 GMT</pubDate></item><item><title><![CDATA[Reply to Birgt das Gefahren? on Thu, 13 Mar 2008 08:41:44 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p><strong>Stefan</strong> schrieb:</p>
<blockquote>
<p>Ich meine, ist es zumindest so sicher wie printf()? ...</p>
</blockquote>
<p>Da Du mindestens eine Fehlerquelle mehr hast als printf (s.a. Konrads Post), KANN es nicht &quot;so sicher wie printf&quot; (das übrigens auch sehr unsicher ist) sein ... schon gar nicht &quot;mindestens&quot;.</p>
<p><strong>Stefan</strong> schrieb:</p>
<blockquote>
<p>...Der Kern meiner Frage war eigentlich, ob die Methode auf die Variablen Argumente zuzugreifen sicher ist, oder ob Gefahr besteht, auf eine verbotene Speicheradresse zuzugreifen....</p>
</blockquote>
<p>Definitiv letzteres.<br />
Nochmal: warum übergibst Du nicht einfach einen vector (bzw. eine Referenz darauf) ?<br />
Funktioniert auch nicht anders, ist aber sicher in all den o.g. und weiteren Belangen.<br />
Schonmal nachgedacht, was passiert, wenn der Aufrufer Folgendes macht:</p>
<pre><code class="language-cpp">myClass peng;
PrintStrs(2, &quot;Hallo&quot;, &amp;peng);
</code></pre>
<p>?</p>
<p>Gruß,</p>
<p>Simon2.</p>
</blockquote>
<p>Du kannst bei printf ja auch den Fehler machen, dass du die falsche Anzahl Formatierungszeichen hast, und falsche Typen übergibst.<br />
Ich fände die v.a.l. einfach elegant, um z.B. ein multidimesionals Array zu dimensionieren:</p>
<pre><code class="language-cpp">void DimArray(int ndims, int size, ...);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1473442</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1473442</guid><dc:creator><![CDATA[__Stefan__]]></dc:creator><pubDate>Thu, 13 Mar 2008 08:41:44 GMT</pubDate></item><item><title><![CDATA[Reply to Birgt das Gefahren? on Thu, 13 Mar 2008 10:11:06 GMT]]></title><description><![CDATA[<p><strong>Stefan</strong> schrieb:</p>
<blockquote>
<p>Ich fände die v.a.l. einfach elegant, um z.B. ein multidimesionals Array zu dimensionieren:</p>
</blockquote>
<p>Grundsätzlich müssen eleganz und Sicherheit nicht unbedingt gleiche Wege gehen, was IMHO aber kein Grund ist <strong>bekanntermaßen unsichere</strong> Konstrukte verwendet werden.</p>
<p>Wem die Vectorübergabe wegen der Initialisierung zu kompliziert erscheint sollte sich mal Boost anschauen (konkret die [assign-Bibliothek](file:///D:/lokal_vc8/boost/libs/assign/doc/index.html)).</p>
<p>Dann sähe dein Aufruf irgendwie so aus (ungetestet):</p>
<pre><code class="language-cpp">void PrintStrings(const std::vector&lt;std::string&gt;&amp; strings);
...
std::vector&lt;std::string&gt; strings; // &lt;-- Besser um Kopieren zu vermeiden mit Anzahl initialisieren
strings += &quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;;
PrintStrings(strings);
...
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1473477</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1473477</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Thu, 13 Mar 2008 10:11:06 GMT</pubDate></item><item><title><![CDATA[Reply to Birgt das Gefahren? on Thu, 13 Mar 2008 10:26:05 GMT]]></title><description><![CDATA[<p>asc schrieb:</p>
<blockquote>
<p>Wem die Vectorübergabe wegen der Initialisierung zu kompliziert erscheint sollte sich mal Boost anschauen (konkret die [assign-Bibliothek](file:///D:/lokal_vc8/boost/libs/assign/doc/index.html)).</p>
</blockquote>
<p>Ja, Boost wollte ich auch schon vorschlagen, allerdings nicht assign sondern (konzeptuell ähnlich) format. Mit folgendem Aufruf:</p>
<pre><code class="language-cpp">PrintStrings() % &quot;a&quot; % &quot;b&quot; % &quot;c&quot;;
</code></pre>
<p>Allerdings besitzt das eine andere Semantik, weil hier keine Parameter an eine Funktion übergeben werden. Das obige Konstrukt müsste irgendwie noch evaluiert werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1473501</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1473501</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Thu, 13 Mar 2008 10:26:05 GMT</pubDate></item><item><title><![CDATA[Reply to Birgt das Gefahren? on Thu, 13 Mar 2008 10:43:24 GMT]]></title><description><![CDATA[<p>Ansonsten könnte man die Funktion PrintStrings ja auch 10 mal überladen, ist sicher und erfordert keine Frickelei <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/1473505</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1473505</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Thu, 13 Mar 2008 10:43:24 GMT</pubDate></item><item><title><![CDATA[Reply to Birgt das Gefahren? on Thu, 13 Mar 2008 12:58:56 GMT]]></title><description><![CDATA[<p><strong>Stefan</strong> schrieb:</p>
<blockquote>
<p>...<br />
Du kannst bei printf ja auch den Fehler machen, dass du die falsche Anzahl Formatierungszeichen hast, und falsche Typen übergibst....</p>
</blockquote>
<p>&quot;falsche Anzahl an Formatierungszeichen&quot;: Stimmt ! Daran hatte ich noch nicht gedacht. Aber das entspricht ja auch den Beispiel von Konrad.<br />
&quot;falsche Typen&quot; entspricht dabei meinem Beispiel.<br />
Also: Vielleicht ist es (bis auf die geringere Bekanntheit) damit nicht schlechter als printf() ... aber das wäre für mich noch lange kein positives Qualitätsurteil.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1473603</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1473603</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Thu, 13 Mar 2008 12:58:56 GMT</pubDate></item></channel></rss>