[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