- Samsung Galaxy S23 és S23+ - ami belül van, az számít igazán
- Telekom mobilszolgáltatások
- Mindenkire rálicitál az új Oppo kameratelefonja
- Xiaomi 15T Pro - a téma nincs lezárva
- Milyen okostelefont vegyek?
- „Új mérce az Android világában” – Kezünkben a Vivo X300 és X300 Pro
- Honor Magic6 Pro - kör közepén számok
- Xiaomi 13T és 13T Pro - nincs tétlenkedés
- Fotók, videók mobillal
- Samsung Galaxy S24 Ultra - ha működik, ne változtass!
Ú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 S23 és S23+ - ami belül van, az számít igazán
- Telekom mobilszolgáltatások
- Philips LCD és LED TV-k
- Milyen billentyűzetet vegyek?
- Mindenkire rálicitál az új Oppo kameratelefonja
- Építő/felújító topik
- E-roller topik
- Küszöbön az androidos PC-k
- Micro Four Thirds
- Xiaomi 15T Pro - a téma nincs lezárva
- További aktív témák...
- PCLab Mini M-218 i3 14100F / 16GB DDR5 / GTX 1650 halk, profin összeszerelt DDR5 build
- TÖBB DARAB ELÉRHETŐ!!! HP USB-C Dock G5 univerzális üzleti dokkoló
- Latitude 5531 15.6" FHD IPS i7-12800H MX550 32GB 1TB NVMe ujjlolv gar
- Canon EF 28-300mm f/3.5-5.6L IS USM - Újszerű -
- - Új - Nikon D7500 fényképezőgép - Új -
- Wacom Cintiq DTK-2260 digitális rajztábla
- Apple iPhone X Space Gray Ikonikus dizájn, Face ID, OLED kijelző 64 GB Használt, megkímélt ,100%
- iPhone 14 128GB Midnight -1 ÉV GARANCIA - Kártyafüggetlen, MS3660
- AKCIÓ! Intel Core i9 14900K 24 mag 32 szál processzor garanciával hibátlan működéssel
- GYÖNYÖRŰ iPhone 15 Plus 128GB Black -1 ÉV GARANCIA - Kártyafüggetlen, MS3355, 100% Akkumulátor
Állásajánlatok
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest
Cég: Promenade Publishing House Kft.
Város: Budapest