Ramon Diaz-Uriarte
2008-Mar-05 10:25 UTC
[R] R_alloc with structures with "flexible array members"
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)? Thanks, R. -- Ramon Diaz-Uriarte Statistical Computing Team Structural Biology and Biocomputing Programme Spanish National Cancer Centre (CNIO) http://ligarto.org/rdiaz
Jeffrey Horner
2008-Mar-05 16:23 UTC
[R] R_alloc with structures with "flexible array members"
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