Verständnisfrage Type casting

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
RaUn
Beiträge: 27
Registriert: 27.09.2010 18:04:12

Verständnisfrage Type casting

Beitrag von RaUn » 10.12.2010 16:41:47

Hallo, ich arbeite gerade dieses Beispiel durch

http://www.linuxjournal.com/article/6735?page=0,2

und bin über die letzte Zeile in diesem Block "gestolpert":

Code: Alles auswählen

 /* Use a buffer large enough to hold one period */
  snd_pcm_hw_params_get_period_size(params,
                                      &frames, &dir);
  size = frames * 4; /* 2 bytes/sample, 2 channels */
  buffer = (char *) malloc(size);
Also "buffer" ist ein Zeiger vom Datentyp char. "Size" beinhaltet die Größe in Bytes, oder? Malloc(size) müsste dann einen Speicherbereich in Bytes der größe "size" zurückgeben, also wofür noch das "(char *)" ? Oder wie liest man diese Zeile / kann man das zum besseren Verständnis in mehreren Zeilen schreiben?

danke vorab...

Benutzeravatar
TRex
Moderator
Beiträge: 8336
Registriert: 23.11.2006 12:23:54
Wohnort: KA

Re: Verständnisfrage Type casting

Beitrag von TRex » 10.12.2010 17:49:30

Auch malloc gibt einen Typ zurück, der eben erstmal Object* entspricht. Mit dem impliziten cast auf char* wird dieser festgelegt..so hab ich das in Erinnerung. Es könnte evt auch ohne funktionieren...aber allein der Verständlichkeit des Codes wegen würde ich das auch so schreiben.
Jesus saves. Buddha does incremental backups.
Windows ist doof, Linux funktioniert nichtDon't break debian!Wie man widerspricht

Benutzeravatar
Meillo
Moderator
Beiträge: 9247
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Verständnisfrage Type casting

Beitrag von Meillo » 10.12.2010 17:56:40

RaUn hat geschrieben:

Code: Alles auswählen

  buffer = (char *) malloc(size);
Also "buffer" ist ein Zeiger vom Datentyp char.[/code]
Er zeigt auf char weil der Inhalt des Speicherbereichs als chars angesehen werden soll. Fuer ein dynamisches Array von Zahlen waere es evtl. ein Zeiger auf int.
"Size" beinhaltet die Größe in Bytes, oder? Malloc(size) müsste dann einen Speicherbereich in Bytes der größe "size" zurückgeben,
Dafuer liest man in der Manpage nach:
man malloc hat geschrieben: malloc() allocates size bytes and returns a pointer to the allocated memory.
Es wird nicht der Speicherbereich, sondern nur ein Zeiger zu ihm zurueckgegeben.
also wofür noch das "(char *)" ?
Es ist eine Art Glaubensfrage ob man die Rueckgabe von malloc() castet oder nicht. Die die casten machen das weil malloc() einen void* zurueckliefert der hier einem char* zugewiesen wird. Wenn die Typen nicht passen/harmonieren castet man ueblicherweise. Ob man es bei Speicheranforderungen auch macht wird unterschiedlich gesehen.


(Vielleicht haengt ess auch damit zusammen, dass es von ANSI-C keine void* gab und damals char* zurueckgeliefert wurden.)
Use ed once in a while!

Benutzeravatar
Meillo
Moderator
Beiträge: 9247
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Verständnisfrage Type casting

Beitrag von Meillo » 10.12.2010 18:01:05

TRex2003 hat geschrieben:...aber allein der Verständlichkeit des Codes wegen würde ich das auch so schreiben.
Manche sehen in der Verstaendlichkeit des Codes auch ein Argument *gegen* den Cast. Aber wie gesagt, es ist groesstenteils eine Glaubensfrage.

Siehe auch:
http://en.wikipedia.org/wiki/Malloc#Cas ... ype_safety

Oder suche nach ``C malloc cast'', da gibt's genug.
Use ed once in a while!

Benutzeravatar
catdog2
Beiträge: 5352
Registriert: 24.06.2006 16:50:03
Lizenz eigener Beiträge: MIT Lizenz

Re: Verständnisfrage Type casting

Beitrag von catdog2 » 10.12.2010 18:06:09

malloc() gibt ja den typ void * zurück. in C scheint das casten tatsächlich überflüssig zu sein, in C++ nicht. (siehe http://openbook.galileocomputing.de/c_v ... 2a20d2a31a "Hinweis" kasten in der mitte)
Unix is user-friendly; it's just picky about who its friends are.

Benutzeravatar
bmario
Beiträge: 1257
Registriert: 05.09.2007 12:15:47
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Dresden

Re: Verständnisfrage Type casting

Beitrag von bmario » 10.12.2010 18:39:12

catdog2 hat geschrieben:malloc() gibt ja den typ void * zurück. in C scheint das casten tatsächlich überflüssig zu sein, in C++ nicht.
In C++ ist malloc() überflüssig und casten ganz ganz phöse ;)
Nichts zu tun ist viel besser,
als mit viel Mühe nichts zu schaffen. - Laotse

Benutzeravatar
catdog2
Beiträge: 5352
Registriert: 24.06.2006 16:50:03
Lizenz eigener Beiträge: MIT Lizenz

Re: Verständnisfrage Type casting

Beitrag von catdog2 » 10.12.2010 18:40:05

Aber es geht. :D
Unix is user-friendly; it's just picky about who its friends are.

Benutzeravatar
Heiko M.
Beiträge: 216
Registriert: 17.01.2005 12:31:34
Lizenz eigener Beiträge: MIT Lizenz

Re: Verständnisfrage Type casting

Beitrag von Heiko M. » 11.12.2010 09:58:17

bmario hat geschrieben:In C++ ist malloc() überflüssig und casten ganz ganz phöse ;)
Habe noch nicht so viel Programmiererfahrung und frage mich, weshalb ein type cast in C++ ganz böse sein soll?
Debian Testing (amd64) + KDE

Benutzeravatar
bmario
Beiträge: 1257
Registriert: 05.09.2007 12:15:47
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Dresden

Re: Verständnisfrage Type casting

Beitrag von bmario » 11.12.2010 10:11:47

Weil C++ anders als C ist. Es gibt nicht viele Stellen, wo Casting Sinn macht. Nenne doch einfach mal Beispiele, wo du gerne casten würdest, in den meisten Beispielen wird sich dann ein Designfehler herausstellen :)

Und jetzt komm nicht mit malloc()! Dafür gibt es operator new() in C++, dieser ist typsicher und (was viel wichtiger ist) er ruft den Konstruktor des Objekts auf.

ps: eine Stelle für Casting wäre, um in nicht-trivialen const und non-const Memberfunktionen Codeverdopplung zu vermeiden.

*edit: Ich merke grade, dass ich die eigentliche Antwort schuldig geblieben bin ^^*
Es ist böse zu casten in C++, weil du damit das Typensystem umgehst und somit dem Compiler di Möglichkeit entziehst, den Code auf Herz und Nieren zu prüfen.

Schau dir dieses einfache Beispiel an:

Code: Alles auswählen

	float a = 3.0;
	// bin jetzt mal Tippfaul und caste mit C-Casts, die C++ Casts würden da aber auch nichts ändern, es sieht nur schöner aus.
	int i = (float) a; // das funktioniert noch wie erwartet, i ist jetzt 3
	int* p = (int*) &a; // das wird jetzt aber Murks, auf meinem System ist die Ausgabe von *p == 1077936128
	std::cout << i << '\n' << *p << std::endl;
Ohne die Casts würde mir das der Kompiler sofort um die Ohren hauen, mit Schluck er es, weil er keine Chance hat, das zu überprüfen. Wir sagen ihm: "Das ist okay so", aber es ist halt nicht immer okay, wie man sieht.
Nichts zu tun ist viel besser,
als mit viel Mühe nichts zu schaffen. - Laotse

Benutzeravatar
Heiko M.
Beiträge: 216
Registriert: 17.01.2005 12:31:34
Lizenz eigener Beiträge: MIT Lizenz

Re: Verständnisfrage Type casting

Beitrag von Heiko M. » 13.12.2010 14:33:51

bmario hat geschrieben:Nenne doch einfach mal Beispiele, wo du gerne casten würdest, in den meisten Beispielen wird sich dann ein Designfehler herausstellen :) ..... Und jetzt komm nicht mit malloc()!
Hab noch nie malloc() verwendet, mache das immer schön mit new(). Mir fällt momentan leider kein Beispiel ein.
bmario hat geschrieben:Es ist böse zu casten in C++, weil du damit das Typensystem umgehst und somit dem Compiler di Möglichkeit entziehst, den Code auf Herz und Nieren zu prüfen.
Das macht Sinn. Wieder was dazugelernt. Danke.
Debian Testing (amd64) + KDE

Antworten