[英]c malloc array of struct
到目前为止,我已经处理了一些指针和结构,但是我不确定如何在运行时分配结构的数组-参见下文。
注意:“ user_size”在运行时初始化。
typedef struct _COORDS
{
double x;
double y;
double area;
double circumference;
int index;
wchar_t name[16];
} COORDS, *PCOORDS;
PCOORDS pCoords = (PCOORDS)malloc(sizeof(COORDS)* user_size);
// NULL ptr check omitted
之后,是否可以像普通的整数数组一样访问pCoords[0]
到pCoords[user_size-1]
?
更重要的是:我不理解编译器如何在分配的内存上叠加结构的布局? 我是否甚至需要对此进行过度思考?
您可能想得太多。 编译器不会在malloc
的内存上“叠加”任何东西-只是一堆字节。
但是,指针是用C 输入的,并且指针的类型决定了当指针被取消引用或在指针设计中使用指针时如何解释内存。 编译器知道该结构的内存布局。 每个字段都有一个定义的大小和一个偏移量,并且该结构的整体大小也是已知的。
在您的情况下,表达式pCoords[i].area = 42.0
等效于
char *pByte = (char*)pCoords + sizeof(COORDS) * i + offsetof(COORDS, area);
double *pDouble = (pDouble*)pByte;
*pDouble = 42.0;
编译器不会在内存上叠加结构-您告诉它这样做!
通过将一个元素的索引乘以其总大小来访问结构数组。 例如, pCoords[3]
是内存中的“ at” pCoords + 3*sizeof(COORDS)
。
通过其偏移量访问结构成员(该偏移量是通过考虑其填充前元素的大小来计算的)。 因此,成员x
从其容器的起始处偏移0
, pCoords
加sizeof(COORDS)
乘以数组元素索引; y
是之后的sizeof(x)
。
因为您告诉编译器(1)您想要一个连续的内存块,其大小为user_size
乘以单个COORD
的大小,并且(2)然后通过pCoords[2].y
访问它,所以要做的就是乘以加,然后读取该内存地址中的值(从字面上看)。 由于y
的类型为double
,因此它将原始字节读取并解释为 double。 通常,它做对了。
可能出现的唯一问题是,当您有多个指向同一内存区域的指针时。 这可能意味着“位于”地址的原始字节可能需要解释为不同的类型(例如,当一个指针告诉它期望一个int
而另一个指针期望一个double
)。
user_size - 1
是有效范围实际上是0
.. user_size - 1
,您的代码很好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.