c结构的malloc数组

c结构的malloc数组,c,arrays,struct,C,Arrays,Struct,到目前为止,我已经处理了一些指针和结构,但我不确定如何在运行时分配结构数组-见下文 注意,“用户大小”在运行时初始化 typedef struct _COORDS { double x; double y; double area; double circumference; int index; wchar_t name[16]; } COORDS, *PCOORDS; PCOORDS pCoords = (PCOORDS)malloc(siz

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

注意,“用户大小”在运行时初始化

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 
在那之后,我可以像使用普通的int数组一样访问
pCoords[0]
pCoords[user\u size-1]


更重要的是:我不明白编译器是如何将结构的布局叠加到分配的内存上的?这是必须的还是我想得太多了?

你可能想得太多了。编译器不会在
malloc
的内存上“叠加”任何内容,那只是一堆字节

但是,指针是用C语言键入的,指针的类型决定了当指针被解除保护或在指针Artimetic中使用时如何解释内存。编译器知道结构的内存布局。每个字段都有一个定义的大小和偏移量,结构的总体大小也是已知的

在您的例子中,表达式
pCoords[i].area=42.0
相当于

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

编译器不会将结构超级强加于内存——您可以让它这样做

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

结构杆件通过其偏移量进行访问(该偏移量根据其前面的图元的大小进行计算,并考虑填充)。因此,成员
x
从其容器的开始处偏移
0
pCoords
加上
sizeof(COORDS)
乘以数组元素索引;而
y
sizeof(x)
之后

由于您告诉编译器(1)您需要一个连续的内存块,其大小为
user\u size
乘以单个
COORD
,并且(2)然后通过
pCoords[2].y来访问它,所以它所要做的就是乘法和加法,然后读取该内存地址中的值(字面上)。由于
y
的类型是
double
,因此它将原始字节读取并解释为double。通常情况下,它是正确的

唯一可能出现的问题是当您有多个指向同一内存区域的指针时。这可能意味着“在”地址的原始字节可能需要解释为不同的类型(例如,当一个指针告诉它需要
int
和另一个
double


只要有效范围为
0
user\u size-1
,您的代码就可以了。

好吧,
pCoords[0]
pCoords[user\u size-1]
,但是可以。它不必在分配的内存上强加任何结构;它只需要知道每件物品的大小@保罗:谢谢你,我省略了CaskIdIf,VisualStudio在我身上抛出了错误C2440(不能转换为‘空洞*’到‘pCOORDS’)。我想这是因为VS自动创建了源文件已经在.CPP上结束的项目,所以我得到了严格的C++类型检查,对吧?