【发布时间】:2016-06-04 15:19:13
【问题描述】:
举个例子:
typedef struct array_struct {
unsigned char* pointer;
size_t length;
} array;
typedef struct vector_struct {
unsigned char* pointer;
// Reserved is the amount of allocated memory not being used.
// MemoryLength = length + reserved;
size_t length, reserved;
} vector;
// Example Usage:
vector* vct = (vector*) calloc(sizeof(vector), 1);
vct->reserved = 0;
vct->length = 24;
vct->pointer = (unsigned char*) calloc(arr->length, 1);
array* arr = (array*) vct;
printf("%i", arr->length);
free(arr->pointer);
free(arr);
C 似乎按照它们在结构中定义的顺序为结构成员分配内存。这意味着如果您投射vector -> array,如果您对array 执行操作,您仍然会得到相同的结果,就像您对vector 执行操作一样,因为它们具有相同的成员和成员顺序。
只要你只从vector -> array 向下转换,就好像array 是vector 的泛型类型,你就不应该遇到任何问题。
尽管类型结构相似,但这是未定义的不良行为吗?
【问题讨论】:
-
您假设
array和vector具有相同的填充,我认为这不能保证。 -
@RobinKrahl 第二个问题的第三个答案说不是。它引用了一篇关于严格别名规则的文章。
-
@FatalSleep 我想答案是特定于编译器的。
gcc是开源的,所以原则上,是的,你可以发现它是如何填充的。 -
我也希望在大多数编译器中它会做你所期望的。很难想象一个 CPU 架构需要根据后面的成员对早期的结构成员进行不同的对齐/填充。
标签: c struct memory-address type-punning