Verständnisfrage zu '0'
-
OK, dankeschön!
Warum ist denn aber eine String-Variable immer 4 Byte gross?
Da kann ich eigentlich ja soviele Zeichen speichern wie ich möchte, oder?
-
Miness schrieb:
OK, dankeschön!
Warum ist denn aber eine String-Variable immer 4 Byte gross?
Da kann ich eigentlich ja soviele Zeichen speichern wie ich möchte, oder?hä wie meinst du string-variable ?
das einzige was "immer" 4Byte belegt ist ein Zeiger.
die Zeichenkette belegt immer so viel Byte, wie groß sie eben ist.#include <iostream> using namespace std; int main() { char zeichenkette[11] = "0123456789"; // 11Byte cout << endl << sizeof(zeichenkette) << " Byte" << endl; char* zeiger_auf_zeichenkette = zeichenkette; cout << endl << sizeof(zeiger_auf_zeichenkette) << " Byte" << endl; system("pause>nul"); return 0; }Theoretisch kannst du so viele Zeichen in eine Zeichenkette packen wie du willst, aber praktisch geht dir irgendwann der Speicherplatz aus^^
-
Mit String-Variable meine ich das hier:
#include <iostream> #include <string> using namespace std; int main() { string test = "0123456789"; // 4 Byte cout << sizeof(test) << endl; }Und hier ist die Variable immer 4 Byte gross, egal wieviele Zeichen ich da rein packe... ^^
-
Liegt wahrscheinlich daran, dass
std::stringintern ebenfalls durch einen Zeiger (nämlichchar*) realisiert ist...EDIT: Ich hab den Code gerade in MSVC kopiert - bei mir gibt der grundsätzlich 32 und nicht 4 aus...
-
Ja, die Zeichen werden woanders gespeichert. "test" ist nur eine Art Verweis darauf.
-
Aha, alles klar! Vielen Dank!
EDIT: @daersc
Liegt wahrscheinlich am Compiler. Jeder Compiler interpretiert anders. Ich nutze den GCC GNU Compiler.
-
naja "string" ist kein primitiver Datentyp sondern eine Klasse (abstrakter Datentyp).
Der sizeof operator liefer immer den Speicherplatz, den der Datentyp verbraucht.
Wie der Datentyp "String" aufgebaut, ist weiß ich net aber er hat halt 4Byte.
Eventuell hat die Klasse ein "char*" Attribut ?!
-
Um an die Anzahl zu kommen, musst Du test.length() verwenden.
-
Ja, dann gibt der Compiler 10 Byte aus!
#include <iostream> #include <string> using namespace std; int main() { string test = "0123456789"; // 10 Byte cout << test.length() << endl; }Danke!
-
Dweb schrieb:
Wie der Datentyp "String" aufgebaut, ist weiß ich net aber er hat halt 4Byte.
Bei ihm. Was sizeof(string) ergibt kann man allgemein nicht sagen.
-
OK, ich kann mir aber auch gut vorstellen dass sizeof(string) nur die Grösse eines Zeiger ausgibt (siehe oben). Aber man weiss es nicht so wirklich... ^^
-
Miness schrieb:
OK, ich kann mir aber auch gut vorstellen dass sizeof(string) nur die Grösse eines Zeiger ausgibt (siehe oben). Aber man weiss es nicht so wirklich... ^^
Richtig, es wird wohl nur eine Art Handle sein (void*), aber verlassen kannst Du dich darauf nicht.
-
Miness schrieb:
Ja, dann gibt der Compiler 10 Byte aus!
string test = "0123456789"; // 10 Bytene, das was du ausgibst ist die länge der Zeichenkette, diese hat nix mit der Byteanzahl zu tun, du allokiert wird.
#include <iostream> using namespace std; int main() { char ar[] = "0123456789"; cout << sizeof(ar) << endl; // Byte cout << strlen(ar) << endl; // Länge system("pause>nul"); return 0; }
-
Funktioniert "strlen" gleich wie "VAR.length"?
-
beides gibt die länge der Zeichenkette zurück.
bei char[] muss man eben strlen verwenden.
bei string muss man length (glaub size gibts sogar auch noch)^^
-
OK, alles klar!
aber eigentlich trotzdem nicht logisch, denn "strlen" = "string length"... ^^
-
wieso nicht logisch oO ?
string, zu deutsch zeichenkette
strlen, länge der zeichenkette
-
Miness schrieb:
Funktioniert "strlen" gleich wie "VAR.length"?
Nein. strlen arbeitet mit nullterminierten char[]-Arrays und zählt die Anzahl der Zeichen bis zur 0. x.length() ist eine Member-Funktion. std::string und char x[...] sind nicht dasselbe.
-
@Dweb: Ja, schon. Aber auf den ersten Blick nicht logisch, da "string" ein anderer Datentyp ist (und string natürlich nicht gleich char ist).
@Baby Yaga: Ja, das hat ja Dweb bereits oben schon erläutert. ^^
-
Vor allem zählt strlen die Zeichen brav nach, während fast alle std::string-Implementationen über die Länge des Strings Buch führen und length() dann nur noch die gespeicherte Länge zurückgeben muss.