<?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 sind TCHAR buffer[4] keine 4 Zeichen?]]></title><description><![CDATA[<p>Hallo,</p>
<p>mir ist da beim schreiben eines Code mal was aufgefallen, was ich in der Vergangenheit einfach ignoriert habe und die Größe des Buffer erhöht habe. Nun möchte ich aber dennoch mal wissen warum das so ist wie es ist, dazu folgender simpler Code:</p>
<pre><code>unsigned long num = 5485245;
	TCHAR szBuffer[18];
	unsigned char buffer;
	tstring hexStr;
	for (int i = 0; i &lt; 4; i++)
	{
		buffer = (char)(num &gt;&gt; (i * 8) &amp; 0xFF);

		SecureZeroMemory(szBuffer, _tcslen(szBuffer));
		_stprintf_s(szBuffer, _T(&quot;%02X&quot;), buffer);

		hexStr.insert(0, szBuffer);
	}

	tcout &lt;&lt; &quot;HEX: &quot; &lt;&lt; hexStr &lt;&lt; &quot;\n&quot;;
</code></pre>
<p>Wenn ich TCHAR szBuffer[18]; auf 17 setzte, kommt der fehler</p>
<pre><code>Run-Time Check Failure #2 - Stack around the variable 'szBuffer' was corrupted.
</code></pre>
<p>Und die 18 wundert mich ja auch schon, ich nehme doch extra TCHAR damit ich mir keine Gedanken machen muss ob ein Buchstabe nun 4 oder 8 oder 16 Byte hat (darum auch tcout und tstring, sind typedef für wstring oder eben string)</p>
<p>Wieso kommt dieser Fehler?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/333971/warum-sind-tchar-buffer-4-keine-4-zeichen</link><generator>RSS for Node</generator><lastBuildDate>Sun, 26 Apr 2026 08:58:30 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/333971.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 14 Aug 2015 10:47:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Warum sind TCHAR buffer[4] keine 4 Zeichen? on Fri, 14 Aug 2015 10:47:42 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>mir ist da beim schreiben eines Code mal was aufgefallen, was ich in der Vergangenheit einfach ignoriert habe und die Größe des Buffer erhöht habe. Nun möchte ich aber dennoch mal wissen warum das so ist wie es ist, dazu folgender simpler Code:</p>
<pre><code>unsigned long num = 5485245;
	TCHAR szBuffer[18];
	unsigned char buffer;
	tstring hexStr;
	for (int i = 0; i &lt; 4; i++)
	{
		buffer = (char)(num &gt;&gt; (i * 8) &amp; 0xFF);

		SecureZeroMemory(szBuffer, _tcslen(szBuffer));
		_stprintf_s(szBuffer, _T(&quot;%02X&quot;), buffer);

		hexStr.insert(0, szBuffer);
	}

	tcout &lt;&lt; &quot;HEX: &quot; &lt;&lt; hexStr &lt;&lt; &quot;\n&quot;;
</code></pre>
<p>Wenn ich TCHAR szBuffer[18]; auf 17 setzte, kommt der fehler</p>
<pre><code>Run-Time Check Failure #2 - Stack around the variable 'szBuffer' was corrupted.
</code></pre>
<p>Und die 18 wundert mich ja auch schon, ich nehme doch extra TCHAR damit ich mir keine Gedanken machen muss ob ein Buchstabe nun 4 oder 8 oder 16 Byte hat (darum auch tcout und tstring, sind typedef für wstring oder eben string)</p>
<p>Wieso kommt dieser Fehler?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2463823</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2463823</guid><dc:creator><![CDATA[MrSpoocy]]></dc:creator><pubDate>Fri, 14 Aug 2015 10:47:42 GMT</pubDate></item><item><title><![CDATA[Reply to Warum sind TCHAR buffer[4] keine 4 Zeichen? on Fri, 14 Aug 2015 10:58:35 GMT]]></title><description><![CDATA[<p>Irgendwie sind da mehrere komische Sachen drin. Einmal</p>
<pre><code>SecureZeroMemory(szBuffer, _tcslen(szBuffer));
</code></pre>
<p>Wieso nutzt du dort <code>_tcslen</code> ? Das zählt doch die Anzahl der Zeichen in szBuffer, der ist aber gerade noch nicht initialisiert also kann da alles mögliche rauskommen. Eigentlich willst du eher das hier:</p>
<pre><code>SecureZeroMemory(szBuffer, sizeof(szBuffer));
</code></pre>
<p>Dann die andere Sache ist dein <code>_stprintf_s</code> Aufruf. Der Zweite Parameter ist doch eigentlich die Größe des Strings oder nicht? Versuch mal sowas:</p>
<pre><code>_stprintf_s(szBuffer, sizeof(szBuffer)/sizeof(szBuffer[0]), _T(&quot;%02X&quot;), buffer);
</code></pre>
<p>Ich hab gerade aber auch ein Windows System zur Hand also kann ich nichts testen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2463825</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2463825</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Fri, 14 Aug 2015 10:58:35 GMT</pubDate></item><item><title><![CDATA[Reply to Warum sind TCHAR buffer[4] keine 4 Zeichen? on Fri, 14 Aug 2015 11:07:06 GMT]]></title><description><![CDATA[<p>Oh, stimmt, nicht _tcslen sondern sizeof ... das ist sogar genau der Fehler.</p>
<p>Ich mache SecureZeroMemory weil es sich in einer schleife befindet und ich sicher stellen möchte das absolut leer ist, den oft kopiere ich dann Daten per memcopy und das sind nicht immer \0-strings. Ist die Einstellung falsch vorher immer zu löschen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2463828</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2463828</guid><dc:creator><![CDATA[MrSpoocy]]></dc:creator><pubDate>Fri, 14 Aug 2015 11:07:06 GMT</pubDate></item><item><title><![CDATA[Reply to Warum sind TCHAR buffer[4] keine 4 Zeichen? on Fri, 14 Aug 2015 11:17:21 GMT]]></title><description><![CDATA[<p>Eigentlich ist das vorherige Löschen unnötig. Es gibt schließlich zwei Fälle: Entweder arbeitet man mit Nullterminierten Daten oder nicht. Wenn es nullterminiert ist, dann hängen String Funktionen wie sprintf und Konsorten sowieso eine abschließende \0 dran. Oder die Daten sind nicht nullterminiert, aber dann ist es eh egal ob am Ende nocht irgendein Müll kommt weil man die Größe separat speichern muss. Man sollte nur nicht anfangen zu mischen zwischen beiden Varianten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2463829</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2463829</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Fri, 14 Aug 2015 11:17:21 GMT</pubDate></item><item><title><![CDATA[Reply to Warum sind TCHAR buffer[4] keine 4 Zeichen? on Fri, 14 Aug 2015 11:23:27 GMT]]></title><description><![CDATA[<p>in welchem header befindet sich tstring?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2463830</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2463830</guid><dc:creator><![CDATA[Erhard Henkes]]></dc:creator><pubDate>Fri, 14 Aug 2015 11:23:27 GMT</pubDate></item><item><title><![CDATA[Reply to Warum sind TCHAR buffer[4] keine 4 Zeichen? on Fri, 14 Aug 2015 11:39:44 GMT]]></title><description><![CDATA[<p>Ich vermute bei tstring handelt es sich um ein typedef, sprich</p>
<pre><code>using tstring = std::basic_string&lt;TCHAR&gt;;
</code></pre>
<p>tcout wohl analog.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2463832</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2463832</guid><dc:creator><![CDATA[Biolunar]]></dc:creator><pubDate>Fri, 14 Aug 2015 11:39:44 GMT</pubDate></item><item><title><![CDATA[Reply to Warum sind TCHAR buffer[4] keine 4 Zeichen? on Fri, 14 Aug 2015 11:50:59 GMT]]></title><description><![CDATA[<pre><code>static std::wistream&amp; tcin = std::wcin;
	static std::wostream&amp; tcout = std::wcout;
	static std::wostream&amp; tcerr = std::wcerr;
	static std::wostream&amp; tclog = std::wclog;

	typedef		std::wstring			tstring;
	typedef		std::wios			tios;
</code></pre>
<p>steht in der tstring-header</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2463833</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2463833</guid><dc:creator><![CDATA[MrSpoocy]]></dc:creator><pubDate>Fri, 14 Aug 2015 11:50:59 GMT</pubDate></item></channel></rss>