[R] passing a string from .C()

Prof Brian Ripley ripley at stats.ox.ac.uk
Tue Mar 2 09:49:18 CET 2004


On Mon, 1 Mar 2004, Vadim Ogranovich wrote:

> Could someone please point to an example of passing strings from .C()
> calls back to R? 

There are not many, as such things are better done using .Call.

> I want to be able to do something like this:
>  
> str <- .C("return_foo_string", str=character(1))$str
>  
> void return_foo_string(char ** str) {
>     *str = "foo";
> }
>  
> The above code has at least two memory allocation "concerns": 
> 1) How to properly allocate "foo". I should probably use R_alloc, e.g.
>  
> char foo[] = "foo";
> *str = R_alloc(sizeof(foo), 1);

That would suffice.  Most uses I see in R addons either use a static
buffer or preallocate enough space in the character vector passed in to .C
(e.g. function tghyper in package SuppDists).


> 2) I don't know if the string pointed to by *str before the
> re-assignment, which now becomes dangling, will be properly reclaimed.

You need to consult the source code (here src/main/dotcode.c).  
The R character vector is copied to a **char construct on the way in, and
the **char construct is copied back to an R character vector on the way
back.  All the allocation is done by R_alloc, and its stack is reset as
do_dotcode is left.  So storage is reclaimed at the next garbage
collection after the .C call.

-- 
Brian D. Ripley,                  ripley at stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595




More information about the R-help mailing list