- WhrlpoolMind: Az eredeti lemez utánozhatatlan illata
- sh4d0w: Netflix? Ugyan, VW előfizetés!
- sziku69: Fűzzük össze a szavakat :)
- Geri Bátyó: Megint tahó voltam – SZEMÉLYISÉGFEJLŐDÉS
- Luck Dragon: Asszociációs játék. :)
- Meggyi001: Nyilvános wc-k.....még mindig hiánypótló...
- sziku69: Szólánc.
- Mr Dini: Mindent a StreamSharkról!
- GoodSpeed: AMD Ryzen 7 7700X vs AMD Ryzen 9 9900X Cinebench R23 & R24 Benchmarkokban mérve
- D1Rect: Nagy "hülyétkapokazapróktól" topik
Új hozzászólás Aktív témák
-
Jester01
veterán
válasz
!wannabe #2508 üzenetére
A castolás tulajdonképpen típus ráerőszakolása. Fontos, hogy C-ben ilyenkor (pointerek esetén) nincs semmi konverzió, vagyis a gép elhiszi neked, hogy az a pointer valóban az amire castolod.
Nagyon rossz példa
const char *text = "1234";
int x = *(int*)text;Ebben az esetben x nem 1 lesz, hanem az "1234" memória leképezésének int megfelelője. Ez ascii kódban a 0x31 0x32 0x33 0x34 byte sorozatot jelenti, ami 32 bites little-endian rendszerben integerként 0x34333231=875770417. Tehát még csak nem is hasonlít arra, amit szegény kezdő programozó gondolt. (Már ha nem a még rosszabb int x = (int)text; formát próbálta.)
A castolást lehetőség szerint kerülni kell, de bizonyos esetekben szükséges rossz. Most hirtelen jó példát nem is tudok rá hozni.
Tipikus hibát viszont igen: ez a void* oda-vissza castolása. Szabvány C-ben erre semmi szükség, mivel a konverzió mind a két irányba automatikus. Példák:
Rossz
int *p = (int*)malloc(10 * sizeof(int));
fwrite((void*)p, sizeof(int), 10, stdout);Helyes
int *p = malloc(10 * sizeof(int));
fwrite(p, sizeof(int), 10, stdout);Bizonyos API függvényekhez viszont szükséges castolni, például a bind ilyen:
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
Itt az addr argumentum valójában egy sereg struct valamelyike lehet, a címtartománytól függően, például sockaddr_un unix sockethez, sockaddr_in internet sockethez, stb. Ilyenkor castolni kell. Mivel semmi garancia nincs cast esetén, ezért ez semmivel sem jobb mintha az argumentum típusa egyszerűen void* lenne (amihez nem kellene cast), de sajnos a szabványba ez került be. Példa:
struct sockaddr_un my_addr;
...
my_addr.sun_family = AF_UNIX;
bind(sfd, (struct sockaddr *) &my_addr, sizeof(struct sockaddr_un));MOD: ja meg az accept is ilyen, azt meg te is használtad
Új hozzászólás Aktív témák
Hirdetés
● olvasd el a téma összefoglalót!
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- AMD Ryzen 9 / 7 / 5 9***(X) "Zen 5" (AM5)
- Milyen légkondit a lakásba?
- Melyik hordozható audiolejátszót (DAP, MP3, stb.) vegyem?
- PROHARDVER! feedback: bugok, problémák, ötletek
- BestBuy ruhás topik
- Autós topik
- REpont és hulladékgazdálkodás
- Xbox Series X|S
- Milyen notebookot vegyek?
- Samsung Galaxy A52s 5G - jó S-tehetség
- További aktív témák...
- Frederick Forsythe: Isten ökle (nem olvasott)
- DDR5 16GB 8GB 32GB 4800MHz 5600MHz RAM Több db
- Lenovo IdeaPad 3 17ITL6 - 17.3" HD+ Intel 6305 - 8GB - 256GB SSD - Win11 - MAGYAR
- Bomba ár! HP Zbook 15 G5 - i7-8750H I 32GB I 512SSD I Nvidia P2000 4GB I FHD I Cam I W11 I Gari!
- Kodak PD460 Instant Dock Printer / Számla és Garancia
Állásajánlatok
Cég: FOTC
Város: Budapest