[Cython] Fwd: automatic character conversion problem

Robert Bradshaw robertwb at math.washington.edu
Tue May 3 06:24:46 CEST 2011


Dear Cython developers,

Recently I encountered a problem with Cython's automatic char* to string
conversion (Cython version 0.14.1). I'll attach two sample source files. The
first one, char2str_a.pyx prints "The quick...", just as I expected. But the
second example prints "... lazy dog.". In the original situation I had a call to
free() instead of the call to strcpy() which I use here for illustration
purposes. Then I got unpredictable results. Apparently the Python string object
keeps referring to the C char* a bit longer than I would expect. A previous
version (0.11.2) didn't have this problem.

Best regards,
Hans Terlouw

--
J. P. Terlouw
Kapteyn Astronomical Institute
University of Groningen
Postbus 800
NL-9700 AV Groningen
The Netherlands

Phone: +31-(0)50-3634068/73
Fax:   +31-(0)50-3636100
Web:   http://www.astro.rug.nl/~terlouw/


cdef extern from "stdlib.h":
  void free(void* ptr)
  void* malloc(size_t size)

cdef extern from "string.h":
  char *strcpy(char *dest, char *src)

def char2str():
  cdef char *c_str_a = <char*>malloc(80)
  cdef char *c_str_b = "The quick...   "
  cdef char *c_str_c = "... lazy dog.  "

  strcpy(c_str_a, c_str_b)

  p_str = c_str_a
  strcpy(c_str_a, c_str_c)
  p_str = p_str.rstrip()
  print p_str



cdef extern from "stdlib.h":
  void free(void* ptr)
  void* malloc(size_t size)

cdef extern from "string.h":
  char *strcpy(char *dest, char *src)

def char2str():
  cdef char *c_str_a = <char*>malloc(80)
  cdef char *c_str_b = "The quick...   "
  cdef char *c_str_c = "... lazy dog.  "

  strcpy(c_str_a, c_str_b)

  p_str = c_str_a
  strcpy(c_str_a, c_str_c)
  print p_str.rstrip()
-------------- next part --------------
cdef extern from "stdlib.h":
   void free(void* ptr)
   void* malloc(size_t size)

cdef extern from "string.h":
   char *strcpy(char *dest, char *src)

def char2str():
   cdef char *c_str_a = <char*>malloc(80)
   cdef char *c_str_b = "The quick...   "
   cdef char *c_str_c = "... lazy dog.  "

   strcpy(c_str_a, c_str_b)

   p_str = c_str_a
   strcpy(c_str_a, c_str_c)
   p_str = p_str.rstrip()
   print p_str

-------------- next part --------------
cdef extern from "stdlib.h":
   void free(void* ptr)
   void* malloc(size_t size)

cdef extern from "string.h":
   char *strcpy(char *dest, char *src)

def char2str():
   cdef char *c_str_a = <char*>malloc(80)
   cdef char *c_str_b = "The quick...   "
   cdef char *c_str_c = "... lazy dog.  "

   strcpy(c_str_a, c_str_b)

   p_str = c_str_a
   strcpy(c_str_a, c_str_c)
   print p_str.rstrip()



More information about the cython-devel mailing list