c结构的malloc阵列



到目前为止,我已经处理了指针和结构,但是我不确定如何在运行时分配结构数组 - 请参见下文。

n.b。" 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 

之后,我可以像ints的普通数组一样访问 pCoords[0]pCoords[user_size-1]

更重要的是:我不明白编译器如何将结构的布局叠加在同层内存上?它甚至必须或我对此进行过多思考?

编译器不会超过内存上的结构 - 您告诉它这样做!

通过将一个元素的索引乘以其总大小来访问结构数组。例如, pCoords[3]是内存中的" at" pCoords + 3*sizeof(COORDS)

通过其偏移访问结构成员(该元素的大小在其前的大小中计算出来,考虑到填充件)。因此,成员 x从其容器的开头,pCoords加上sizeof(COORDS)乘以数组元素索引的偏移0;和y之后是sizeof(x)

由于您 tell 编译器(1)您想要一个连续的内存块,其大小适用于user_size乘以COORD的大小,然后(2)然后通过pCoords[2].y访问它,它要做的就是乘积并添加,然后在该内存地址中读取(字面意思)的值。由于y的类型是double,因此它读取并将RAW BYTES 解释为 a double。通常,它正确。

唯一可能出现的问题是,当您对同一内存区域中有多个指针。这可能意味着原始字节"在"一个地址可能需要将其解释为不同类型(例如,当一个指针告诉它期望int,而另一个指针则是double)。

有效范围是Acutsy 0 .. user_size - 1,您的代码很好。

您可能正在考虑这一点。编译器不会在malloc'ED内存上"叠加"任何内容 - 这只是一堆字节。

但是,指针是在c中键入,指针的类型确定了当指针被否决或用于指针的指针时,解释。编译器知道结构的内存布局。每个字段都有定义的大小和偏移量,并且结构的整体尺寸也已知。

在您的情况下,表达式pCoords[i].area = 42.0等于

char *pByte = (char*)pCoords + sizeof(COORDS) * i + offsetof(COORDS, area);
double *pDouble = (pDouble*)pByte;
*pDouble = 42.0;

最新更新