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

Ramon Diaz-Uriarte rdiaz02 at gmail.com
Wed Mar 5 18:52:40 CET 2008


Dear Jeff,

Thanks for the suggestion. However, something is still not working.
This is a simple example:

***************************  start C ************
#include <R.h>

struct Sequence {
  int len;
  unsigned int state_count[];
};


int main(void) {

  struct Sequence *A;
  int n = 4;

  // First line segfaults. Second doesn't
    A = (struct Sequence *) R_alloc(1,  sizeof(struct Sequence) + n *
sizeof(unsigned int));
  //  A = malloc(sizeof(struct Sequence) + n * sizeof(unsigned int));

  return(0);
}

***********  end C  **********


I then do
gcc -std=gnu99 -Wall -I/usr/share/R/include -I/usr/share/R/include
-L/usr/lib/R/lib -lR ex7.c

and the ./a.out segfaults when I use R_alloc (not with malloc).


Best,

R.

On Wed, Mar 5, 2008 at 5:23 PM, Jeffrey Horner
<jeff.horner at vanderbilt.edu> wrote:
> 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
>



-- 
Ramon Diaz-Uriarte
Statistical Computing Team
Structural Biology and Biocomputing Programme
Spanish National Cancer Centre (CNIO)
http://ligarto.org/rdiaz



More information about the R-help mailing list