<?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[Wie groß darf ein char-Array sein?]]></title><description><![CDATA[<p>Hallo,<br />
ich habe bei einem Programm gerade folgendes Problem,<br />
ich versuche 1 MiB einer Datei in ein Chararray einzulesen.<br />
Dabei gibt es schon einen Fehler, wenn ich das Array so anlege:</p>
<pre><code class="language-cpp">double bla=1024*1024;
char blub[bla];
</code></pre>
<p>wenn ich jedoch auf folgende art das Array anlege, bekomme ich keine Fehler:</p>
<pre><code class="language-cpp">char blub[1024*1024];
</code></pre>
<p>weshalb?<br />
Darf man nicht so grosse Arrays anlegen?</p>
<p>Hier mal ein kleines Beispiel mit Compilerfehlern:</p>
<pre><code class="language-cpp">const double B = 1;
const double KiB = 1024*B;
const double MiB = 1024*KiB;

ifstream read;
char readstring[MiB];//compilerfehler
//error: size of array ‘readstring’ has non-integral type ‘const double’
char help_char;
double d=0;

read.open(pathread);
while ((read.get(help_char))&amp;&amp;(d&lt;MiB))
{
	readstring[d] = help_char;//compilerfehler
//error: invalid types ‘char [1][double]’ for array subscript
	d++;
}
read.close();
</code></pre>
<p>Ein Ausweg wäre es, mit std::string zu arbeiten, wobei es deutlich uneffizienter wäre,deke ich mal, da ich dann zig stringoperatoren hätte (im weiteren Programmablauf)...<br />
Und nein, es reicht nicht, wenn ich nur 65000 B einlese, indem ich einen integer verwende. Ich will immer gleich ein MiB einlesen und später dann auch schreiben. Je kleiner die Datensätze sind, desto länger dauert es!!!<br />
Hab mir dazu mal ein kleines Programm geschrieben, das nur Daten generiert. Mit dem einen MiB kam ich ganz gut weg und ein KiB war schlichtweg ne Katastrophe. Die Datensätze dürfen aber keinesfalls an die Grösse des RAM heranreichen, dann wird auf der HDD ausgelagert, und das ist kein Spass!!!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/268292/wie-groß-darf-ein-char-array-sein</link><generator>RSS for Node</generator><lastBuildDate>Tue, 01 Sep 2026 21:04:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/268292.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 07 Jun 2010 09:22:26 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wie groß darf ein char-Array sein? on Mon, 07 Jun 2010 09:22:26 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich habe bei einem Programm gerade folgendes Problem,<br />
ich versuche 1 MiB einer Datei in ein Chararray einzulesen.<br />
Dabei gibt es schon einen Fehler, wenn ich das Array so anlege:</p>
<pre><code class="language-cpp">double bla=1024*1024;
char blub[bla];
</code></pre>
<p>wenn ich jedoch auf folgende art das Array anlege, bekomme ich keine Fehler:</p>
<pre><code class="language-cpp">char blub[1024*1024];
</code></pre>
<p>weshalb?<br />
Darf man nicht so grosse Arrays anlegen?</p>
<p>Hier mal ein kleines Beispiel mit Compilerfehlern:</p>
<pre><code class="language-cpp">const double B = 1;
const double KiB = 1024*B;
const double MiB = 1024*KiB;

ifstream read;
char readstring[MiB];//compilerfehler
//error: size of array ‘readstring’ has non-integral type ‘const double’
char help_char;
double d=0;

read.open(pathread);
while ((read.get(help_char))&amp;&amp;(d&lt;MiB))
{
	readstring[d] = help_char;//compilerfehler
//error: invalid types ‘char [1][double]’ for array subscript
	d++;
}
read.close();
</code></pre>
<p>Ein Ausweg wäre es, mit std::string zu arbeiten, wobei es deutlich uneffizienter wäre,deke ich mal, da ich dann zig stringoperatoren hätte (im weiteren Programmablauf)...<br />
Und nein, es reicht nicht, wenn ich nur 65000 B einlese, indem ich einen integer verwende. Ich will immer gleich ein MiB einlesen und später dann auch schreiben. Je kleiner die Datensätze sind, desto länger dauert es!!!<br />
Hab mir dazu mal ein kleines Programm geschrieben, das nur Daten generiert. Mit dem einen MiB kam ich ganz gut weg und ein KiB war schlichtweg ne Katastrophe. Die Datensätze dürfen aber keinesfalls an die Grösse des RAM heranreichen, dann wird auf der HDD ausgelagert, und das ist kein Spass!!!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1908195</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1908195</guid><dc:creator><![CDATA[sudo rm -rf]]></dc:creator><pubDate>Mon, 07 Jun 2010 09:22:26 GMT</pubDate></item><item><title><![CDATA[Reply to Wie groß darf ein char-Array sein? on Mon, 07 Jun 2010 09:24:55 GMT]]></title><description><![CDATA[<p>Heap.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1908196</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1908196</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Mon, 07 Jun 2010 09:24:55 GMT</pubDate></item><item><title><![CDATA[Reply to Wie groß darf ein char-Array sein? on Mon, 07 Jun 2010 09:26:13 GMT]]></title><description><![CDATA[<p>die erste Fehlermeldung ist klar: für die Größenangaben darf nur ein ganzzahliger Datentyp verwendet werden. Double geht nicht.</p>
<p>Die zweite dürfte sich dann auch erledigen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1908197</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1908197</guid><dc:creator><![CDATA[zwutz]]></dc:creator><pubDate>Mon, 07 Jun 2010 09:26:13 GMT</pubDate></item><item><title><![CDATA[Reply to Wie groß darf ein char-Array sein? on Mon, 07 Jun 2010 09:26:21 GMT]]></title><description><![CDATA[<p>Verwend mal nicht double, verwend int.<br />
Ein array das 17,3 groß ist würde ja auch keinen Sinn machen.</p>
<pre><code class="language-cpp">char blub[1024*1024];
</code></pre>
<p>geht, weil 1024*1024 vom typ int ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1908198</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1908198</guid><dc:creator><![CDATA[Kleiner Troll]]></dc:creator><pubDate>Mon, 07 Jun 2010 09:26:21 GMT</pubDate></item><item><title><![CDATA[Reply to Wie groß darf ein char-Array sein? on Mon, 07 Jun 2010 09:30:40 GMT]]></title><description><![CDATA[<p>sudo rm -rf schrieb:</p>
<blockquote>
<p>Hallo,<br />
ich habe bei einem Programm gerade folgendes Problem,<br />
ich versuche 1 MiB einer Datei in ein Chararray einzulesen.<br />
Dabei gibt es schon einen Fehler, wenn ich das Array so anlege:</p>
<pre><code class="language-cpp">double bla=1024*1024;
char blub[bla];
</code></pre>
</blockquote>
<p>Double ist ein Gleitkommatyp und nicht wirklich geeignet hier. Nimm <em>const unsigned</em>.</p>
<blockquote>
<p>wenn ich jedoch auf folgende art das Array anlege, bekomme ich keine Fehler:</p>
<pre><code class="language-cpp">char blub[1024*1024];
</code></pre>
<p>weshalb?</p>
</blockquote>
<p>Steht in der Fehlermeldung.</p>
<blockquote>
<p>//error: size of array ‘readstring’ has non-integral type ‘const double’</p>
</blockquote>
<blockquote>
<p>Darf man nicht so grosse Arrays anlegen?</p>
</blockquote>
<p>Wenn der Stack groß genug ist, geht das. Aber 1 MB dürfte bei den Defaulteinstellungen schon hart an der Grenze sein.</p>
<blockquote>
<p>Ein Ausweg wäre es, mit std::string zu arbeiten, wobei es deutlich uneffizienter wäre,deke ich mal, da ich dann zig stringoperatoren hätte (im weiteren Programmablauf)...</p>
</blockquote>
<p>Und die Stringoperationen sind bei einem Array kostenlos?<br />
Mach es mit std::string und werde glücklich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1908199</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1908199</guid><dc:creator><![CDATA[Nukularfüsiker]]></dc:creator><pubDate>Mon, 07 Jun 2010 09:30:40 GMT</pubDate></item><item><title><![CDATA[Reply to Wie groß darf ein char-Array sein? on Mon, 07 Jun 2010 09:31:24 GMT]]></title><description><![CDATA[<p>sudo rm -rf schrieb:</p>
<blockquote>
<p>Dabei gibt es schon einen Fehler, wenn ich das Array so anlege:</p>
<pre><code class="language-cpp">double bla=1024*1024;
char blub[bla];
</code></pre>
<p>wenn ich jedoch auf folgende art das Array anlege, bekomme ich keine Fehler:</p>
<pre><code class="language-cpp">char blub[1024*1024];
</code></pre>
<p>weshalb?<br />
Darf man nicht so grosse Arrays anlegen?</p>
</blockquote>
<p>Wenn du keine dynamische Speicherverwaltung machst, muss die Größe eines Arrays konstant sein: ... und wieso nimmst du double?</p>
<pre><code class="language-cpp">const int BLA = 1024*1024;
char blub[BLA];

int size = 1024*1024;
char* pa = new char[size]; //dynamisch
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1908201</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1908201</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 07 Jun 2010 09:31:24 GMT</pubDate></item><item><title><![CDATA[Reply to Wie groß darf ein char-Array sein? on Mon, 07 Jun 2010 09:39:10 GMT]]></title><description><![CDATA[<p>oh klar, dachte double, weil double groß ist.<br />
ich dachte int hätte die größe von short, aber das passt ja rein...<br />
sorry und danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1908206</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1908206</guid><dc:creator><![CDATA[sudo rm -rf]]></dc:creator><pubDate>Mon, 07 Jun 2010 09:39:10 GMT</pubDate></item><item><title><![CDATA[Reply to Wie groß darf ein char-Array sein? on Mon, 07 Jun 2010 10:11:59 GMT]]></title><description><![CDATA[<p>Int hat die Länge eines longs auf x86.<br />
Double und Float sind Gleitkommatypen mit unterschiedlicher Präzision.</p>
<p>Mit C++0x gibts den Header cstdint. Dieser enthält zusätzlich Typen wie uint8_t, uint16_t, uint32_t, uint64_t, size_t, uintptr_t, int8_t, int16_t, int32_t und int64_t.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1908222</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1908222</guid><dc:creator><![CDATA[mr z]]></dc:creator><pubDate>Mon, 07 Jun 2010 10:11:59 GMT</pubDate></item><item><title><![CDATA[Reply to Wie groß darf ein char-Array sein? on Mon, 07 Jun 2010 10:18:27 GMT]]></title><description><![CDATA[<p>mr z schrieb:</p>
<blockquote>
<p>Int hat die Länge eines longs auf x86.</p>
</blockquote>
<p>Hängt vom Compiler ab. long dürfen nach C++-Standard durchaus sehr viel länger sein.</p>
<p>Fellhuhn schrieb:</p>
<blockquote>
<p>Heap.</p>
</blockquote>
<p>Nö. Stack.</p>
<p>Nukularfüsiker schrieb:</p>
<blockquote>
<blockquote>
<p>Darf man nicht so grosse Arrays anlegen?</p>
</blockquote>
<p>Wenn der Stack groß genug ist, geht das. Aber 1 MB dürfte bei den Defaulteinstellungen schon hart an der Grenze sein.</p>
</blockquote>
<p>Man darfs durchaus versuchen. Ob das dann am Ende Funktioniert hängt vom Compiler und den Compilereinstellungen ab. Vom Standard her ist die Grenze std::numeric_limits<a href="std::size%5C_t" rel="nofollow">std::size\_t</a>::max()</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1908223</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1908223</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 07 Jun 2010 10:18:27 GMT</pubDate></item><item><title><![CDATA[Reply to Wie groß darf ein char-Array sein? on Mon, 07 Jun 2010 18:19:54 GMT]]></title><description><![CDATA[<p>sudo rm -rf schrieb:</p>
<blockquote>
<p>Hallo,<br />
ich habe bei einem Programm gerade folgendes Problem,<br />
ich versuche 1 MiB einer Datei in ein Chararray einzulesen.<br />
Dabei gibt es schon einen Fehler, wenn ich das Array so anlege:</p>
<pre><code class="language-cpp">double bla=1024*1024;
char blub[bla];
</code></pre>
</blockquote>
<p>Das ist falsch, wie bereits mehrfach angemerkt wurde. Allerdings gibt es in C++ nur einen Datentyp, den man für Feldgrößen verwenden kann ohne Probleme zu bekommen &quot;size_t&quot;. Das ist immer dann wichtig, wenn man über Felder iterieren will, und man alle Elemente garantiert erreichen will.</p>
<pre><code class="language-cpp">#include &lt;cstddef&gt;

size_t bla = 1024*1024;
char blub[bla];
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1908502</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1908502</guid><dc:creator><![CDATA[*john 0]]></dc:creator><pubDate>Mon, 07 Jun 2010 18:19:54 GMT</pubDate></item><item><title><![CDATA[Reply to Wie groß darf ein char-Array sein? on Mon, 07 Jun 2010 20:24:23 GMT]]></title><description><![CDATA[<p>Naja, size_t ist auch nur ein typedef für unsigned long.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1908591</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1908591</guid><dc:creator><![CDATA[freaky]]></dc:creator><pubDate>Mon, 07 Jun 2010 20:24:23 GMT</pubDate></item><item><title><![CDATA[Reply to Wie groß darf ein char-Array sein? on Mon, 07 Jun 2010 22:10:09 GMT]]></title><description><![CDATA[<p>FreakY&lt;3Cpp schrieb:</p>
<blockquote>
<p>Naja, size_t ist auch nur ein typedef für unsigned long.</p>
</blockquote>
<p>Nö.<br />
Kann auch ein Typedef auf was anderes sein. z.B. <code>unsigned long long</code> bei MSVC im 64 Bit Modus.</p>
<p>p.S.: andere Frage: darf ein Array bzw. allgemein ein Objekt grösser als <code>numeric_limits&lt;ptrdiff_t&gt;::max()</code> sein, wenn <code>numeric_limits&lt;ptrdiff_t&gt;::max() &lt; numeric_limits&lt;size_t&gt;::max()</code> ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1908651</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1908651</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 07 Jun 2010 22:10:09 GMT</pubDate></item><item><title><![CDATA[Reply to Wie groß darf ein char-Array sein? on Mon, 07 Jun 2010 22:14:33 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>FreakY&lt;3Cpp schrieb:</p>
<blockquote>
<p>Naja, size_t ist auch nur ein typedef für unsigned long.</p>
</blockquote>
<p>Nö.<br />
Kann auch ein Typedef auf was anderes sein. z.B. <code>unsigned long long</code> bei MSVC im 64 Bit Modus.</p>
</blockquote>
<p>War nur darauf bezogen, dass es kein eigener Datentyp ist :p</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1908664</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1908664</guid><dc:creator><![CDATA[freaky]]></dc:creator><pubDate>Mon, 07 Jun 2010 22:14:33 GMT</pubDate></item><item><title><![CDATA[Reply to Wie groß darf ein char-Array sein? on Mon, 07 Jun 2010 23:37:37 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>FreakY&lt;3Cpp schrieb:</p>
<blockquote>
<p>Naja, size_t ist auch nur ein typedef für unsigned long.</p>
</blockquote>
<p>Nö.<br />
Kann auch ein Typedef auf was anderes sein. z.B. <code>unsigned long long</code> bei MSVC im 64 Bit Modus.</p>
<p>p.S.: andere Frage: darf ein Array bzw. allgemein ein Objekt grösser als <code>numeric_limits&lt;ptrdiff_t&gt;::max()</code> sein, wenn <code>numeric_limits&lt;ptrdiff_t&gt;::max() &lt; numeric_limits&lt;size_t&gt;::max()</code> ?</p>
</blockquote>
<p>klar - wieso nicht?<br />
und: ptrdiff_t::max &lt; size_t::max sollte imho immer gelten<br />
weil signed_x::max &lt; unsigned_x::max...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1908692</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1908692</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Mon, 07 Jun 2010 23:37:37 GMT</pubDate></item><item><title><![CDATA[Reply to Wie groß darf ein char-Array sein? on Tue, 08 Jun 2010 01:15:28 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>FreakY&lt;3Cpp schrieb:</p>
<blockquote>
<p>Naja, size_t ist auch nur ein typedef für unsigned long.</p>
</blockquote>
<p>Nö.<br />
Kann auch ein Typedef auf was anderes sein. z.B. <code>unsigned long long</code> bei MSVC im 64 Bit Modus.</p>
<p>p.S.: andere Frage: darf ein Array bzw. allgemein ein Objekt grösser als <code>numeric_limits&lt;ptrdiff_t&gt;::max()</code> sein, wenn <code>numeric_limits&lt;ptrdiff_t&gt;::max() &lt; numeric_limits&lt;size_t&gt;::max()</code> ?</p>
</blockquote>
<p>klar - wieso nicht?<br />
und: ptrdiff_t::max &lt; size_t::max sollte imho immer gelten<br />
weil signed_x::max &lt; unsigned_x::max...</p>
<p>bb</p>
</blockquote>
<p>Schon klar dass ptrdiff_t::max &lt; size_t::max der &quot;übliche&quot; Fall ist.</p>
<p>Warum nicht? Weil das Ergebnis einer Subtraktion zweier Zeiger ein ptrdiff_t ist. Wenn ich nun ein char-Array hernehme das grösser ist als ptrdiff_t::max, und dann array[n] - array[0] rechne, dann bekomme ich nen festen Topfen heraus. Vermutlich nicht im Sinne des Erfinders <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/1908700</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1908700</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 08 Jun 2010 01:15:28 GMT</pubDate></item><item><title><![CDATA[Reply to Wie groß darf ein char-Array sein? on Tue, 08 Jun 2010 06:43:21 GMT]]></title><description><![CDATA[<p>FreakY&lt;3Cpp schrieb:</p>
<blockquote>
<p>Naja, size_t ist auch nur ein typedef für unsigned long.</p>
</blockquote>
<p>Das garantiert die Norm aber nicht! Dagegen ist es garantiert, daß man mit size_t alle Elemente eines Arrays adressieren kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1908730</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1908730</guid><dc:creator><![CDATA[*john 0]]></dc:creator><pubDate>Tue, 08 Jun 2010 06:43:21 GMT</pubDate></item></channel></rss>