[R] R_alloc with structures with "flexible array members"

Jeffrey Horner jeff.horner at vanderbilt.edu
Wed Mar 5 17:23:29 CET 2008


Ramon Diaz-Uriarte wrote on 03/05/2008 04:25 AM:
> Dear All,
> 
> In a package, I want to use some C code where I am using a structure
> (as the basic element of a linked list) with flexible array members.
> Basically, this is a structure where the last component is an
> incomplete array type  (e.g., Harbison & Steel, "C, a reference
> manual, 5th ed.", p. 159) such as:
> 
> struct Sequence {
>   struct Sequence *next;
>   int len;
>   unsigned int state_count[];
> };
> 
> 
> To create one such sequence, I allocate storage (following Harbison
> and Steel) in a C program as follows:
> 
> struct Sequence *A;
> int n = 4;
> A = malloc( sizeof(struct Sequence) + n * sizeof(unsigned int));
> 
> 
> If I understand correctly, however, it would be better to use R_alloc
> instead of malloc (memory automagically freed on exit and error;
> error-checking). But I do not know how to make the call to R_alloc
> here, since R_alloc allocates n units of size bytes each.
> 
> 
> I've tried, without success, the following two:
> 
> int to_add_for_R_alloc =
>     (int) ceil((float) sizeof(struct sequence) / sizeof(unsigned int));
> 
>   A = (struct sequence *) R_alloc(to_add_for_R_alloc + n,
> sizeof(unsigned int));
> 
> or even a brute force attempt as:
> 
>  A = (struct sequence *) R_alloc( 100,  sizeof(struct sequence));
> 
> 
> but both result in segmentation faults.
> 
> 
> Should I just keep using malloc (and free at end)?

Hi Ramon,

You should be able to use R_alloc without seg faults, so there's 
something wrong with your code somewhere. R_alloc multiplies its 
arguments together to come up with the total number of bytes to allocate 
then it allocates a raw vector and returns the data portion.

So you can just treat R_alloc similarly to malloc by calling 
R_alloc(1,sizeof(struct Sequence) + n * sizeof(unsigned int)).

Best,

Jeff
-- 
http://biostat.mc.vanderbilt.edu/JeffreyHorner



More information about the R-help mailing list