Ú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!
- MIUI / HyperOS topik
- The Division 2 (PC, XO, PS4)
- Napelem
- NVIDIA GeForce RTX 5080 / 5090 (GB203 / 202)
- Telekom mobilszolgáltatások
- Lexus, Toyota topik
- Motorolaj, hajtóműolaj, hűtőfolyadék, adalékok és szűrők topikja
- A nagy Szóda, Szódakészítés topic - legyen egy kis fröccs is! :-)
- GL.iNet Flint 2 (GL-MT6000) router
- Apple iPhone 17 - alap
- További aktív témák...
- Gamer PC: Ryzen 5 5600 I B550 WiFi6 I 16GB DDR4 I RX 590 8GB I 1TB NVMe I 1000W I HAF XB EVO
- Samsung 850 EVO 1TB Sata3 SSD / Beszámítás OK!
- Intel I7-7700K / Beszámítás OK!
- Új állapotban! Lenovo ThinkPad T14 Gen 3 i5-1245/16gb ram/256 ssd FHD+ garancia
- !AKCIÓ! GAMER PC Intel Core i9-10900X/ASUS ROG Strix X299-E Gaming/NVIDIA GeForce RTX 3080/32 GB RAM
- Samsung Evo 970 Plus 500GB Nvme SSD!
- BESZÁMÍTÁS! Lenovo Legion Slim 5 16APH8 Gamer notebook - R7 7840HS 32GB DDR5 1TB SSD RTX 4070 8GB
- GYÖNYÖRŰ iPhone SE 2020 64GB Black-1 ÉV GARANCIA - Kártyafüggetlen, MS4463, 100% Akkumulátor
- Telefon felvásárlás!! Samsung Galaxy S23/Samsung Galaxy S23+/Samsung Galaxy S23 Ultra
- Zalman N7 Plus V2 prémium számítógépház
Á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


