On 26/08/14 13:14, Jeff King wrote: > On Tue, Aug 26, 2014 at 12:57:21PM +0100, Ramsay Jones wrote: > >>> + ret = xcalloc(1, base + extra); >>> + va_start(ap, fmt); >>> + vsnprintf(ret + offset, extra, fmt, ap); >> >> What is the relationship between 'base' and 'offset'? >> >> Let me assume that base is always, depending on your compiler, either >> equal to offset or offset+1. Yes? (I'm assuming base is always the >> sizeof(struct whatever)). Do you need both base and offset? > > It's much more complicated than that. Take "struct name_decoration", for > instance, which looks like this: > > struct name_decoration { > struct name_decoration *next; > int type; > char name[FLEX_ARRAY]; > }; > > On my 64-bit system using gcc, sizeof() returns 16; it has to pad the > whole thing to 64-bit alignment in case I put two of them in an array. > But offsetof(name) is 12, since the array of char does not need the same > alignment; it can go right after the type and make use of the padding > bits. Hmm, interesting. I must re-read the standard. I was convinced that the standard *requires* any alignment padding to come *before* the name field. (how would you put a, non-trivial, variable data structure into an array?) ATB, Ramsay Jones -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html