[C++]Array ist größer als angegeben

11/01/2011 16:55 Che#1

Jo hab n kleines Problem:
Code:
//Dateigroesse rausfinden

char sTemp;
       int lFileSize = 0;
       fstream f;
       f.open("C:/test.dat", ios::in);
        while(!f.eof())
         {
        f.read(&sTemp, 1);
        lFileSize++;
         }
//1 abziehen (letztes Zeichen ist whitespace)
        lFileSize--;
//Groesse des Arrays cstring setzen        
    char *cstring = new char(lFileSize);
//lFileSize ausgeben = 3
cout << lFileSize << endl;
//Groesse des Arrays cstring ausgeben = 4 ?!?
    cout << sizeof(cstring) << endl;
gibt mir zurück:
Quote:
3
4
Der Inhalt der Datei test.dat ist 3 Zeichen lang (Inhalt: abc) aber mein Array cstring ist anstatt 3 Zeichen 4 Zeichen lang :mad:

Ich raffs nicht wirklich, da lFileSize ja eigentlich nicht 4 ist, sondern 3. Da ich später die Datei einlese und den ASCII-Wert jedes Zeichens ausgeb kommt es spätestens dann zu Fehlern.
Was mach ich falsch?!?


€dit:
Ich Idiot
Jetzt auch draufgekommen, dass ich die größe eines Arrays auf das ich zeige so nicht auslesen kann, bitte closen!
11/01/2011 17:19 Xenox3#2
Eine Array braucht immer eine Element mehr als man eigentlich braucht.

Bsp: int Array[3];
Array[0],Array[1],Array[2],Array[3]

Das ist nun eine Array mit 3 Elementen, da man das letzte nicht benutzen darf/kann.
Somit ist die größe eigentlich 4 (3+1) ;) hoffe das ist verständlich

Ansonsten MR Smith it's your turn :)
11/01/2011 17:30 ms​#3
Der sizeof-Operator gibt in deinem Fall die Größe des Pointers an, nicht die Länge des Arrays auf das es zeigt.

sizeof (char *) == 4
(unter der Annahme, dass es sich um ein 32-Bit-System handelt)

Versuchs mal mit strlen.
11/01/2011 17:39 MrSm!th#4
Quote:
Originally Posted by Xenox3 View Post
Eine Array braucht immer eine Element mehr als man eigentlich braucht.

Bsp: int Array[3];
Array[0],Array[1],Array[2],Array[3]

Das ist nun eine Array mit 3 Elementen, da man das letzte nicht benutzen darf/kann.
Somit ist die größe eigentlich 4 (3+1) ;) hoffe das ist verständlich

Ansonsten MR Smith it's your turn :)
Das gilt nur für C-Strings, weil da ein 0-Terminator gebraucht wird.

Was du erklärt hast, ist aber doppelt falsch.

Array[3] gibt es nicht.
Du hast ein Array mit 3 Elementen erstellt, wie du schon sagst.
Da der Index aber bei 0 anfängt, ist es eben von 0 bis 2. Gäbe es noch 3, dann hättest du ja ein Element mehr als gewünscht o.ô

Das was MS gesagt hat stimmt. Sizeof ist ein Operator, der zur Compilezeit aufgelöst wird.
Zur Compilezeit kann der Compiler aber nicht wissen, wie groß der Speicherbereich ist, auf den dein Pointer zeigt. Deshalb gilt es hier für die Größe des Pointers, was 4 Bytes ist.
Die Größe eines Arrays erhälst du nur bei sizeof in Verbindung mit einem Array.
11/01/2011 17:48 Che#5
Jo danke für die Antworten, Dad hats mir grad auch nochmal erklärt:
Kann die größe des Arrays auf das ich zeige so natürlich nicht rausfinden, besser ist es anstatt mit sizeof direkt mit lFileSize zu rechnen.

Kann geclosed werden!
11/01/2011 17:50 MrSm!th#6
#closed