Reserva de Memoria en SXUB

Manuel Luis Aranda Luque a4680580@ns.vlc.servicom.es
Tue, 09 Dec 1997 12:51:06 +0100


Estoy tratando de enlazar perl con librerias de C.

Expongo un problema concreto mediante un ejemplo.

Quiero utilizar desde perl la funcion strcat de C que sigue la siguiente
sintaxis:

#include <string.h>
char *strcat(char *dest, const char *src);

Esta funcion de C añade el string src al string dest sobreecribiendo el
caracter '\0' que hay
al final de dest, y añadiendo un caracter de terminación '\0' al final. El
string dest debe tener
suficiente espacio para el resultado.


1) Ejecutamos el comando h2xs -A -n Prueba

2) Editamos el fichero Prueba.xs

   ...
   ...
   #include "XSUB.h"
   #include <string.h>
   #ifdef __cplusplus
   ...
   ...

   MODULE = Prueba  PACKAGE = Prueba

   char *
   strcat(dest,src)
           char *dest
           char *src
           OUTPUT:
                  RETVAL	

3) Editamos el fichero Prueba.pm
   
   ...
   ...
   @EXPORT(Prueba);
   ...
   ...

4) Ejecutamos perl Makefile.PL

5) Ejecutamos make

6) Editamos el fichero test.pl
 
   ...
   ...
   BEGIN { $| = 1; print "1..2\n"; }
   ...
   ...
   $destino = "Destino";
   $origen = "Origen";
   print Prueba::strcat($destino,$origen);

7) Ejecutamos make test

   El resultado será:
   ...
   1..2
   ok 1
   DestinoOrigen

Pero si en el fichero test.pl llenamos $origen con una cadena larga se
producirá el error
make: *** [test_dynamic] Segmentation fault (core dumped) debido a que no
se ha reservado 
memoria para el string de resultado destino.


¿Como se realiza la reserva de memoria para eliminar el problema?
¿Código alternativo?

Gracias,

Manuel Luis Aranda Luque