C - pretypovani pointeru
Michal Kubecek
mike na mk-sys.cz
Pondělí Březen 14 12:41:35 CET 2005
On Mon, Mar 14, 2005 at 12:23:32PM +0100, Jan Kasprzak wrote:
> Ale tohle dela neco uplne jineho nez chci. Ja nechci do callbacku
> predavat pointer na "fd" - ta promenna uz pak vubec nemusi existovat.
> Ja fakt chci predavat jen to cislo. Coz muzu, protoze
>
> sizeof(int) <= sizeof(void *)
>
> (i kdyz ISO C99 to explicitne nezminuje, pokud dobre ctu; nevidel jsem
> ale platformu, kde by tohle neplatilo).
Tak to napište takto:
void my_callback(void* arg)
{
int fd = *((int*) arg);
close(fd);
free(arg);
}
int main(int argc, char* argv[])
{
int fd = open("test", "r");
int* x = (int*) malloc(sizeof(int));
register_callback(my_callback, x);
}
(samozřejmě s ošetřením chyby při alokaci). Budete-li spoléhat na
univerzální pravdy typu 'sizeof(int) == sizeof(void*)', téměř jistě
dříve či později najdete platformu, kde to nebude pravda. Problémy
při překladu některých aplikací na x86_64 nechť jsou vám varováním.
Michal Kubeček
Další informace o konferenci Linux