- Samsung Galaxy S25 Ultra - titán keret, acélos teljesítmény
- iPhone topik
- One mobilszolgáltatások
- Közönségkedvenc tábla készül hazai startra
- Yettel topik
- Külföldi prepaid SIM-ek itthon
- Motorola Edge 60 Fusion - nem csak a forma időtálló
- Almás kagylót főznek Cupertinóban
- Itt az első hivatalos poszter a Galaxy S26 Ultrához
- Huawei Watch GT 6 és GT 6 Pro duplateszt
Ú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
● olvasd el a téma összefoglalót!
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- Samsung Galaxy Watch Ultra LTE - Garanciális 2027 Júliusig
- iPhone 15 PRO 128GB natúr titán KÁRTYAFÜGGETLEN! Gyönyörű! Akkumlátor 87%
- Makulátlan ASUS VivoBook S14 M3402QA OLED - Ryzen 5 5600H, 14, 1TB SSD, 16GB RAM!
- Sosemhasznált! HP OmniBook 5 i7-1355U 16GB 512GB 16" FHD+ Gar.: 1 év
- Legion Pro 5 16ADR10 16" QHD+ IPS Ryzen 9 8940HX RTX 5060 16GB 1TB NVMe gar
- BESZÁMÍTÁS! ASROCK H510M i5 11400F 8GB DDR4 256GB SSD GTX 1650 4GB Rampage SHIVA DeepCool 400W
- Prémium PC házak akár 20-40% kedvezménnyel eladók garanciával, számlával! Upd. 02.02
- KÜLÖNLEGES RITKASÁG! VADIÚJ Microsoft Surface Pro 12 12" Snapdragon X Plus 16GB 512GB LEVENDULA 686g
- Bomba ár! Dynabook Portege X30L-J - i7-1165G7 I 16GB I 256SSD I 13,3" FHD I Cam I W11 I Garancia!
- Surface Pro 7+ i5-1135G7 16G 256GB 1 év garancia
Állásajánlatok
Cég: Central PC számítógép és laptop szerviz - Pécs
Város: Pécs
Cég: Laptopműhely Bt.
Város: Budapest



