Bpl has asked for the wisdom of the Perl Monks concerning the following question:

Hi monkers, in those days, I am writing an XS library but I am having some difficulties converting the C's malloc and memset instruction into the perl's equivalent (for the perlClib) the code snippet is:
# C code r = (AirLorconDriver *) malloc(sizeof(AirLorconDriver *)); # where AirLorconDriver is: struct lorcon_driver { struct lorcon_driver *next; char *name; char *details; lorcon_drv_init init_func; lorcon_drv_probe probe_func; }lorcon_driver_t; typedef lorcon_driver_t AirLorconDriver;
This was the malloc's problem, the memset snippet is:
# C code memset(l_packet, 0, sizeof(AirLorconDriver)); # where l_packet is: AirLorconDriver *l_packet;
Can anyone help me translating those 2 obscure C function into perl's Newx and Zero functions? Thanks Edoardo Mantovani, 2020

Replies are listed 'Best First'.
Re: help with XS (Newx and
by Corion (Patriarch) on Sep 05, 2020 at 18:33 UTC

    Without testing it and actually going from the perlapi documentation for Newxz, the following should give you an allocated buffer, filled with zeroes:

    AirLorconDriver * l_packet; Newxz( l_packet, 1, AirLorconDriver); /* Remember to use SafeFree() to release the memory pointed to by l_pa +cket */

    Update: Also see perlguts for more discussion of Newx() and friends

      Hi! sorry if I ask, but the
      Newxz( l_packet, 1, AirLorconDriver);
      would be referred to the memset or to the malloc function? because in the malloc case (r = (AirLorconDriver *) malloc(sizeof(AirLorconDriver *) );) there isn't any packet_l. thanks Edoardo Mantovani, 2020

        Newxz is a combined malloc() plus memset() call, see perlapi and perlguts on it.

        I think the usage would be to declare the pointer to your struct and then to have it allocated and zeroed like this:

        Newxz( r, 1, AirLorconDriver );