Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Was macht die sizeof()-funktion

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
11.09.2003, 16:18 Uhr
typecast
aka loddab
(Operator)


Hallo

was macht den die sizeof() Funktion. Ich dachte, dass sie die Größe der Übergebenen Variable bestimmt. Ich habe die Funktion mal auf ein char* losgelassen. Egal wieviel Speicher ich allokiere, sizeof() liefert immer 4 zurück.
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
11.09.2003, 16:27 Uhr
Pablo
Supertux
(Operator)


Tja, char* ist ein Pointer, also ein "int". char* ist eine Variable, die eine Adresse speichert und sizeof(int) ist 4, wenn ich mich nicht irre.

Was meinst du die Größe eines char* sein muss? Etwa die Länge? strlen(char*) liefert die Länge.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 11.09.2003 um 16:27 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
11.09.2003, 16:28 Uhr
typecast
aka loddab
(Operator)


Ah ich dachte, dass in diesem Fall Länge und Größe das selbe sind.
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
11.09.2003, 17:00 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat:
Pablo Yanez Trujillo postete
Tja, char* ist ein Pointer, also ein "int"

Sorry, das ist ziemlicher Unsinn. char* ist ein Pointer. Ja. Aber ein Pointer ist ein Pointer und deshalb kein int.
Daß ein sizeof(int)==sizeof(char*) == 4 ist, ist wirklich ein reiner Zufall.

@loddab
sizeof gibt wahlweise die Größe eines Types zurück oder die einer Variable. Die Größe einer Variable entspricht aber immer der Größe ihres Typs:

C++:
char* p;
sizeof(char*)==sizeof(p); // Beides ist gleich


Wenn Du nun Speicher belegst mit malloc oder new:

C++:
char* p = new char[100];


Dann weist du p einfach einen neuen Wert zu. Dadurch ändert sich nicht die größe von p, sondern nur der Inhalt von p. Es ist sogar so, daß die die Größe einer Variable niemals ändern kann (weil eine Variable nicht den Typ wechseln kann).
Was Du vermutlich ein wenig durcheinanderwürfelst sind Pointer und Arrays:

C++:
char array[20];
char* pointer = new[20];


pointer ist also - wie bereits gesagt - ein Zeiger, der hat die Größe sizeof(char*), weil er vom Typ char* ist. Der Standard garantiert darüberhinaus, daß sizeof(char*)==sizeof(void*). Sei vorsichtig mit Aussagen, daß dies immer 4 sei. Das wäre eine Falsche Aussage,
array ist ein Array - man kann es in manchen Situatoinen synonym zu einem Pointer verwenden, aber es ist kein Pointer. Es hat einen anderen Datentyp. explizit mit eigenem Datentypen kannst Du das Array auch so definieren:

C++:
typedef char array_type[20]; /* Definiere Typ */
array_type array;


Nun ist also sizeof(array) == sizeof(array_type) was in der Regel 20*sizeof(char) == 20 ist.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
11.09.2003, 17:05 Uhr
virtual
Sexiest Bit alive
(Operator)


Acho, sei auch vorsichtig, mit der Aussage, strlen würde die Länge von irgendwas anderem als strings zurückliefern. Wenn Du mit new oder malloc speicher belegst, gibt es keinen andewren weg, die Speichergröße zu bestimmen, indem man sie sich merkt, mit welchen parametern man das malloc oder new gemacht hat. Alle anderen Überlegungen sind entweder falsch oder systemabh (die Runtime Library von M$ hat IMHO eine Funktion, um die Bytegröße eines Speicherblocks zu bestimmen - finger weg davon, wenn du portabel bleiben willst!)
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 11.09.2003 um 17:06 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
11.09.2003, 17:19 Uhr
0xdeadbeef
Gott
(Operator)


Übrigens wird sizeof schon zur Compilezeit zu einer Konstanten expandiert. sizeof ist also in dem Sinne keine Funktion.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
11.09.2003, 17:29 Uhr
Pablo
Supertux
(Operator)



Zitat:
virtual postete

Sorry, das ist ziemlicher Unsinn. char* ist ein Pointer. Ja. Aber ein Pointer ist ein Pointer und deshalb kein int.
Daß ein sizeof(int)==sizeof(char*) == 4 ist, ist wirklich ein reiner Zufall.



Das wusste ich doch, aber ich konnte nicht anders erklären, deshalb hab ich gesagt, als wäre es "int".


Zitat:
virtual postete
Acho, sei auch vorsichtig, mit der Aussage, strlen würde die Länge von irgendwas anderem als strings zurückliefern. Wenn Du mit new oder malloc speicher belegst, gibt es keinen andewren weg, die Speichergröße zu bestimmen, indem man sie sich merkt, mit welchen parametern man das malloc oder new gemacht hat. Alle anderen Überlegungen sind entweder falsch oder systemabh (die Runtime Library von M$ hat IMHO eine Funktion, um die Bytegröße eines Speicherblocks zu bestimmen - finger weg davon, wenn du portabel bleiben willst!)


Du hast mich ein bisschen verwirrt, kann man strlen benutzen, wenn man ein char* mit new bzw. malloc abfragen?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
11.09.2003, 17:41 Uhr
kronos
Quotenfisch
(Operator)


man kann, aber es wird die zeichen bis zum 0-char zählen und nicht den gemallocten speicher.
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
11.09.2003, 18:58 Uhr
Pablo
Supertux
(Operator)




wenn ich char* mit malloc initialisiere und dann (sagen wir mal) mit strcpy(..., "hallo"); initialisiere, dann liefert strlen(...) 5, oder? Was ist denn da das Problem? Oder liefert strlen nicht 5?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
11.09.2003, 19:03 Uhr
typecast
aka loddab
(Operator)


@Pablo: Es geht um Typen die nicht char* sind. Die Probleme tauchen auf, wenn man einen Pointer auf einen anderen Typ übergibt.
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: