Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » void* malloc Frage

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
25.04.2006, 15:19 Uhr
~3D3K4
Gast


Lese mich derzeit etwas durch das buch des geistigen vaters vn c++(name ist mir entfallen). Dort wird zum holen von speicher die methode malloc geholt die einem dann ja eine pointer zurückliefert vom typ void.

Hab das in den c++ crashkursen bisher nur so gehabt das ich mir z.b. mit new speicher für 5 integer geholt hab und mir das in einem pointer vom typ int gespeichert hab.

Wieso kann ich mir mit malloc speicher in einem pointer vom typ void speichern? das ist doch total nachteilig, so kann ich ja gar nicht mehr via ++ bzw -- den pointer rauf/runter zählen. Oder in welchen Situationen bietet es sich an einfach x-byte zu holen. wäre es nicht sinnvoller speicher für ein objekt anzufordern? da weis ich wie groß das ist und hol mir entsprechend auch nicht zuviel speicher.

Kann mir jemand etwas den sinn von malloc erklären und bsp. für situationen nennen in dem es sinnvoll ist malloc und void* Pointern zu arbeiten?

Danke für Erklärungen
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
25.04.2006, 15:24 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


du musst den rückgabe wert von malloc in den entsprechenden typ casten. Wenn du c++ verwendest solltest du aber bei new und delete bleiben.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
26.04.2006, 13:55 Uhr
RHBaum




Zitat:

Oder in welchen Situationen bietet es sich an einfach x-byte zu holen.


Generell zum beispiel wenn einem der inhalt des Speichers wurscht iss .....

C++ programmierer greifen dann entweder A selber auf C-Schnittstellen Ihres BS zurueck, oder B helfen sich mit "schmutzigen" tricks ....
oftmals allociert man in c++ speicher als char felder, weil eben ein char ein byte gross ist. was passiert, wenn irgendwann irgend ein compiler mal char groesser definiert ?
Im Ansi C++ Standard steht glaub ich, das char mindestens 1 byte gross sein muss ....

Schreib mal ne C++ routine die dir X Byte speicher allokiert ohne nen Datentyp verwenden zu duerfen ^^

reines C++ tut sich mit untypisierten Speicher eigentlich recht schwer ... innerhalb von C++ braucht man es aber auch kaum oder gar nicht. nur wenn man C funktionen bedienen muss /darf ist diese typisierung manchmal nicht erforderlich/hinderlich.

nen void * drueckt halt besser das man keine Ahnung vom inhalt hat, nen char * suggeriert halt das es sich um ne folge von chars handelt, was logisch falsch sein kann ....

Fazit:
unter C++ nutzt man eh kaum untypisierten Speicher ... wenn du es mal nutzen musst, meist nur durch andere libs, APIs mit C Verhalten, dann sind Tricks und ne C-like behandlung eh ok ....

Ciao ...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
26.04.2006, 16:29 Uhr
virtual
Sexiest Bit alive
(Operator)


[quote RHBaum]
Zitat:

Im Ansi C++ Standard steht glaub ich, das char mindestens 1 byte gross sein muss ....



Oh äh... ??

Was soll denn der Unterschied zwischen Byte und char sein?

Sowohl in C alsauch in C++ ist ein Byte ein Speicherbereich, weilcher ein char aufnehmen kann.
Wenn Du genau hinschaust wirst Du feststellen, daß sizeof(char) immer 1 ist. Dh es gibt auch keine Möglichkeit, ein char in eine kleinere addressierbare Einheit zu zerteilen, nie.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 26.04.2006 um 16:30 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
26.04.2006, 18:51 Uhr
RHBaum



ich kenn sogar Quellcode mit :
assert(sizeof(char) == 1);

Warum kommen Menschen auf so komsiche Gedanken ?

Gab wohl die ein oder andere Andeutung, Vorhersehung oder was weiss ich, das es doch Exoten gibt wo das nicht gilt ^^
Ob sowas wirklich standard conform iss weiss ich ned ...
Mir persoenlich iss sowas natuerlich auch noch nie unter die finger gekommen. ^^ Aber Embedded tools entwickler leben eh in ihrer eigenen welt ^^
Und man liest ab und an mal immer wieder drueber ...

Was sagt nu der standard genau zu ? sizeof(char) == 1 oder sizeof(char) >= 1 ???

Kommt wohl auch daher,das char von den meisten in dieser Art und weise definiert wird:

Type char is an integral type that usually contains members of the execution character set — in Microsoft C++, this is ASCII.

Also char eher an die groesse gebunden, die das BS als systemspez. zeichensatz zu grunde legt, als an die kleinste teilbare speichereinheit.
(In C# is char scho 16bit ^^ aber die duerfen auch nich auf dem speicher rumwuseln ^^ )

Da char ja in Solchen faellen mit der API compatibel bleiben muss, und Microsoft eh nen eigenen compiler hat der datentypen definiert ... Sag niemals nie ! ^^

Es ist nur nen typedef weit entfernt:

// typedef __int8 char;
typedef __int16 char;

achnee iss ja Microsoft, also eher :
// #define char __int8
#define char __int16

Ciao ...

Dieser Post wurde am 26.04.2006 um 18:57 Uhr von RHBaum editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
26.04.2006, 20:31 Uhr
virtual
Sexiest Bit alive
(Operator)


Fangen wir mal mit dem ANSI C Standard an:

Als Unterpunkt des Kaptiels 3 ("Terms, Definitions, and Symols") steht da:

Zitat:

3.6
byte addressable unit of data storage large enough to hold any member of the basic character set of the execution environment
NOTE 1 It is possible to express the address of each individual byte of an object uniquely.
NOTE 2 A byte is composed of a contiguous sequence of bits, the number of which is implementationdefined. The least significant bit is called the low-order bit; the most significant bit is called the high-order bit.


Dann bzgl. sizeof:

Zitat:

6.5.3.4 The sizeof Operator
[...]
When applied to an operand that has type char, unsigned char, or signed char, (or a qualified version thereof) the result is 1.



Bzgl. C++ sieht es ganz ähnlich aus: Die Aussage bzgl. des sizeof Operators findet sich hier im Abschnitt 5.3.3; Die Aussage zum byte liest sich im Absschnitt 1.7 ("The C++ memory model") wie im C Standard folgt (Beide Passagen kann ich hier nicht per paste&copy reinkopieren, weil meine PDF Version des Standards kein Copy erlaubt ).


[edit]
Was ich jetzt nicht kopiert habe: Beim sizeof Operator wird auch gesagt, daß er die Größe eine Objekts in Bytes zurückgibt. Spätestens dadurch wird klar: char==byte)
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 26.04.2006 um 20:33 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
26.04.2006, 22:21 Uhr
FloSoft
Medialer Over-Flow
(Administrator)



Zitat:

sequence of bits, the number of which is implementationdefined



d.h aber auch das es u.U. auch nur 7Bit sein können, oder auch 16 oder mehr, auch wenn sizeof dann trotz allem 1 liefert, oder?

Also das sizeof(char) == 1 aber char != 8bit vorkommen kann wenn ich das so richtig sehe.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
27.04.2006, 00:44 Uhr
virtual
Sexiest Bit alive
(Operator)


Genau. Die zentrale Aussage ist: ein char ist in C die kleinste adressierbare Einheit; diese muß so groß sein, daß man ein Zeichen damit speichern kann.

Die verbreitete/falsche Annahme, daß ein Byte 8 Bit groß sei ist wohl auf die heutzutage vorherrschende Monokultur bei Prozessoren zurückzuführen - ich habe dunkel in Erinnerung, daß es auch 9-Bittige Bytes gab/gibt.
--
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
008
27.04.2006, 08:32 Uhr
FloSoft
Medialer Over-Flow
(Administrator)



Zitat von virtual:
Die verbreitete/falsche Annahme, daß ein Byte 8 Bit groß sei ist wohl auf die heutzutage vorherrschende Monokultur bei Prozessoren zurückzuführen - ich habe dunkel in Erinnerung, daß es auch 9-Bittige Bytes gab/gibt.

kommt halt eben auf die Maschine an, ich hab hier diverse Mikroprozessoren die nur 7Bit haben, d.h 1 Byte ist dort 7 Bit und char eben nur 0 - 127 dadurch, da das "8te bit" immer 0 ist (zumindest im zugehörigen ASM-Code)
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
27.04.2006, 10:39 Uhr
RHBaum



@virtual

Danke, jetzt weiss ich wo ich wenigstens zu schauen hab ...
Wenn sizeof mittels char soweiso definiert ist, muss char soweiso die kleinste Addressierbare Einheit sein ....

Glaub unser Informatiklehrer hat uns damals nicht die ganze Wahrheit oder nur nen Teil eingetrichtert ...

Wir haben mal gelernt, 1 Byte ist in der Informatik die Einheit fuer die angabe von Speichergroessen von logischen Werten. 1 Byte ist damit immer 8 bit, plattformunabhaengig ....

Das in der Ascii version ein zeichen (0-127) auch als Byte bezeichnet wird, haett ich ned gewusst ...

VIelleicht sollte ich meine alte 120er GB pladde bei Ebay mit 480 Gigabytes(DEC-PDP-11) Kapazitaet verkaufen, faellt bestimmt irgendwer drauf rein ^^ Fuer irgendwas muss ja das wissen gut sein ^^ Obwohl, wenn derjenige dann darauf besteht, dass alle 480 gigas von den 2^6ern einzeln addressierbar sind, koennt ich in erklaerungsnoete kommen ^^

Ciao ...
 
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: