Hirdetés
- Drága Bluetooth tagek olcsóbb alternatívái (MiLi MiTag, LiTag, OTAG, stb.)
- Yettel topik
- Samsung Galaxy Fit 3 - keveset, de jól
- Honor Magic6 Pro - kör közepén számok
- Samsung Galaxy Watch7 - kötelező kör
- VoLTE/VoWiFi
- Samsung Galaxy A54 - türelemjáték
- A piac legerősebb kameráját ígéri a Xiaomi 17 Ultra
- Xiaomi 14 - párátlanul jó lehetne
- Android szakmai 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
● olvasd el a téma összefoglalót!
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- Háztartási gépek
- sziku69: Fűzzük össze a szavakat :)
- TCL LCD és LED TV-k
- Ingatlanos topic!
- NVIDIA GeForce RTX 5070 / 5070 Ti (GB205 / 203)
- AMD Ryzen 9 / 7 / 5 9***(X) "Zen 5" (AM5)
- Pécs és környéke adok-veszek-beszélgetek
- Elemlámpa, zseblámpa
- D1Rect: Nagy "hülyétkapokazapróktól" topik
- Drága Bluetooth tagek olcsóbb alternatívái (MiLi MiTag, LiTag, OTAG, stb.)
- További aktív témák...
- Lenovo Thinkpad P1 Gen 6 - i9-13980HX, 32GB, 2TB SSD, 16" WQUXGA (3840 2400), RTX 4090
- 15.gen! Intel Core Ultra 9 285K +16-32GB DDR5 RAM +hűtött VRM-es Z890 lap! GAR/SZÁMLA (a Te nevedre)
- OP AudioCodes C450HD Ip Phones - Szines kijelzős - Teams/ Zoom telefon - Új dobozos
- ATEN Cat 5 KVM over IP Switch Altusen KH1508AI - Új ára 284.000Ft
- AirPort Extreme 802.11n (3rd Generation) Model A1301 -
- GYÖNYÖRŰ iPhone 14 128GB Midnight -1 ÉV GARANCIA - Kártyafüggetlen, MS3971, 94% Akkumulátor
- GYÖNYÖRŰ iPhone 12 64GB Blue -1 ÉV GARANCIA -Kártyafüggetlen, MS4121
- Keresünk Galaxy S22/S22+/S22 Ultra
- IKEA Format lámpák eladóak (Egyben kedvezménnyel vihető!)
- HIBÁTLAN iPhone 13 Pro 256GB Sierra Blue 1ÉV GARANCIA -Kártyafüggetlen, MS3743, 91% Akkumulátor
Állásajánlatok
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest
Cég: BroadBit Hungary Kft.
Város: Budakeszi



