This works for dynamically allocating memory (an array of char): SV * create_image(int size) { char * image; New(0,image,size,char); memset(image,CLEAR,size); return sv_setref_pv(newSViv(0),"image", (void *)image); }
void destroy_image(SV * p) { char * image = (char *) SvIV(SvRV(p)); Safefree(image); } And to access the memory as an array of char: void clear_image(SV * p,int size) { char * image = (char *) SvIV(SvRV(p)); memset(image,CLEAR,size); } I would assume something similar would work for a struct, something along the lines of: typedef struct { SV * suit; int value; } CARD; SV * create_card(int size) { CARD * my_card; New(0,my_card,size,CARD); memset(my_card,CLEAR,size*sizeof(CARD)); return sv_setref_pv(newSViv(0),"card", (void *)my_card); } which would allocate memory for an array of cards (a 'deck' so to speak), and return the pointer to the array. I would have done a function to create one card, but it would not have been any simpler. And for whatever reason, I have trouble getting Inline to properly recognize and bind functions that pass no params (int myfunc(void)). And to hand out cards from Perl: void deal_card(SV * p,SV * suit,int value) { CARD * my_card = (CARD *) SvIV(SvRV(p)); my_card->suit = suit; my_card->value = value; return; } I'm not 100% sure on the "SvIV(SvRV(p))" part -- It's what works for an array of char. Hope this was helpful. -- Dave