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