- bambano: Bambanő háza tája
- sziku69: Fűzzük össze a szavakat :)
- eBay-es kütyük kis pénzért
- Luck Dragon: Alza kuponok – aktuális kedvezmények, tippek és tapasztalatok (külön igényre)
- Luck Dragon: Asszociációs játék. :)
- Elektromos rásegítésű kerékpárok
- plevips: Sorozatkövető v 1.1
- Candy: IGPU dGPU passthrough, avagy a nem minden arany, amin megy a Furmark
- sziku69: Szólánc.
- D@reeo: Pi-hole és a Telekom Sagemcom F@st 5670 DNS beállítása
Ú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!
- Forza Horizon 6 - Vár ránk Japán!
- Multimédiás / PC-s hangfalszettek (2.0, 2.1, 5.1)
- Beleremegett Hollywood Brad Pitt és Tom Cruise AI harcába
- Banggood
- Audi, Cupra, Seat, Skoda, Volkswagen topik
- Vezetékes FEJhallgatók
- PlayStation 5
- Battlefield 6
- Beelőzte az iparágat a HBM4 tömeggyártásával a Samsung
- Épített vízhűtés (nem kompakt) topic
- További aktív témák...
- iPhone XR - 64GB - Független - Gyönyörű állapot - FACE ID OFF!
- iPhone XR - 64GB - Független - Hibátlan - Gyönyörű állapot
- DDR5 5600 Ramok eladóak 8 gb - 16 GB - 32 GB
- Eladó 4 db SZINTE ÚJ M.2 NVMe SSD (Gen4) 2 512GB + 2 256GB OEM
- Beszámítás! HP Elitebook 8 G1i 14 FHD notebook - Ultra 5 235U 16GB DDR5 256GB SSD Intel IGP W11
- GYÖNYÖRŰ iPhone SE 2020 64GB Black -1 ÉV GARANCIA - Kártyafüggetlen, MS3920
- HP ProDesk 600 G5 i5-9500 16GB 512GB 1 év garancia
- Bomba ár! HP ProBook 430 G6 - i5-8265U I 8GB I 128SSD I HDMI I 13,3" FHD I Cam I W10 I Gari!
- ÁRGARANCIA!Épített KomPhone Ryzen 5 4500 16/32/64GB RAM RTX 3060 12GB GAMER PC termékbeszámítással
- HP Thunderbolt-dokkoló, 120W G4 (4J0A2AA)
Állásajánlatok
Cég: Laptopműhely Bt.
Város: Budapest

