如何应用结构偏移?

我有一个结构

typedef struct foo { int lengthOfArray1; int lengthOfArray2; int* array1; int* array2; } foo; 

我需要为整个结构及其数组的内容分配足够的内存。 假设每个arrays的长度为5 ……

 foo* bar = (foo*)malloc(sizeof(foo) + (sizeof(int) * 5) + (sizeof(int) * 5)); 

我现在必须将array1和array2指向该分配缓冲区中的正确位置:

 bar->array1 = (int*)(&bar->lengthOfArray2 + sizeof(int)); bar->array2 = (int*)(bar->array1 + lengthOfArray2); 

它是否正确?

编辑#1

只是为了消除任何困惑:我试图将内存保留在一个块中,而不是三个。

编辑#2

我不能使用C99,因为MSVC 2010编译器不支持它(http://stackoverflow.com/questions/6688895/does-microsoft-visual-studio-2010-supports-c99)。

遵循OP的方法,这应该做的工作:

 /* Defining these types allows to change the types without having the need to modify the code. */ typedef int Foo_ArrayElement1_t; typedef int Foo_ArrayElement2_t; typedef struct Foo_s { size_t lengthOfArray1; /* 'size_t' is the type of choice for array/memory dimensions. */ size_t lengthOfArray2; Foo_ArrayElement1_t * array1; Foo_ArrayElement2_t * array2; } Foo_t; /* * Allocates memory to hold a structure of type Foo_t including size for * 's1' elements referenced by 'array1' and 's2' elements by 'array2'. * The arrays' elements are set to 0. * * Returns a pointer to the freshly allocated memory or NULL if the memory could not * be allocated. */ Foo_t * Foo_CreateAndInit(size_t s1, size_t s2) { /* At once allocate all 'Foo_t' (including the memory Foo_t's array pointers shall point to). */ Foo_t * pfoo = calloc(1, sizeof(*pfoo) + s1 * sizeof(*(pfoo->array1) + s2 * sizeof(*(pfoo->array2))); if (pfoo) { pfoo->lengthOfArray1 = s1; pfoo->lengthOfArray2 = s2; /* The first array starts right after foo. */ pfoo->array1 = (Foo_ArrayElement1_t *) (pfoo + 1); /* The second array starts right after s1 elements of where the first array starts. */ pfoo->array2 = (Foo_ArrayElement2_t *) (pfoo->array1 + s1); /* That casting here is not necessaryas long as 'Foo_t.array1' and 'Foo_t.array2' point to the same type but makes the code work even if those types were changed to be different. */ } return pfoo; } ... Foo_t * foo = Foo_CreateAndInit(5, 5); 

您必须分配结构的大小。 然后,您必须分配具有各自大小的整数数组。

 foo* bar = malloc(sizeof(foo)); /* somewhere in here the array lengths are set then... */ bar->array1 = malloc(sizeof(int) * bar->lengthOfArray1); bar->array2 = malloc(sizeof(int) * bar->lengthOfArray2); 

有一点额外的内存(仅适用于C99):

 #include  #include  typedef struct foo { int lengthOfArray1; int lengthOfArray2; int *array1; int *array2; int array[]; } foo; int main(void) { foo *bar = malloc(sizeof(foo) + (sizeof(int) * 10)); bar->array1 = &bar->array[0]; bar->array2 = &bar->array[5]; /* 5 or lengthOfArray1 */ return 0; }