----Original Message---- >From: [EMAIL PROTECTED] >Sent: 19 September 2005 12:09
> "Dave Korn" writes: > >> ----Original Message---- >>> From: Richard Henderson >>> Sent: 19 September 2005 11:26 >>> In the case of the (fake) flexible array member, you do not know >>> how large the object allocated from malloc was unless you can >>> track down the actual malloc call. >> >> Do you suppose the idiom is common enough that VRP could special-case >> "arrays of size 1 at the end of a struct" ? > > it could be array of size 2, 3, 4, 5, ... I've seen this trick used again and again and again, and *I* haven't _ever_ seen anyone use anything except an array size of [1] in this place. That is to say, I've seen a lot of code that says (to start with your example): <------------------------------------- typedef struct { int data[1]; } foo; foo* p = (foo *) malloc (sizeof (foo) + N * sizeof (int)); ------------------------------------- [dk note: I would expect to see (N-1) * sizeof (int) here more usually. well, either that, or I would expect the comment to read 'enough room for N+1 ints'.] ------------------------------------- // there are enough room for N ints, and the store is properly // aligned. for (int i = 0; i < N; ++i) p->data[i] = frobnicate (N, i); -------------------------------------> but I have never, never, ever seen code that says: <------------------------------------- typedef struct { int data[3]; } foo; foo* p = (foo *) malloc (sizeof (foo) + (N-3) * sizeof (int)); // there are enough room for N ints, and the store is properly // aligned. for (int i = 0; i < N; ++i) p->data[i] = frobnicate (N, i); -------------------------------------> Have you? cheers, DaveK -- Can't think of a witty .sigline today....