我用这个创建了一个2D数组:
struct Cars (*ParkingLot)[FloorCount] = malloc(sizeof(struct Cars[FloorCount][10]));
我不知道这是否重要,但FloorCount
现在设置为1,struct Cars
就是这样定义的:
struct Cars
{
int ID;
char color[20];
char type[20];
};
无论如何,我试图在函数中使用这个数组,我无法访问数组中的值。 例如,下一件事:
void CarIn (struct Cars *Lot[])
{
printf("%d", Lot[0][0].ID);
}
ParkingLot[0][0].ID=15;
CarIn(ParkingLot);
这不是我想要的,但它是我能想到的最基本的功能,它将帮助我完成其余的工作。
编辑:
好吧,我已经设法使用该功能进行打印,我只需要在&
之前添加Lot[0][0].ID
...
我现在遇到的另一个问题是这个功能似乎根本不起作用,它总是崩溃:
void CarIn (struct Cars *Lot[],struct Cars New)
{
Lot[0][0]=New;
return;
}
答案 0 :(得分:1)
首先,您的大小调整在ParkingLot
的分配声明中是错误的。我假设你想要每层10辆汽车和任意数量的楼层,如果是这样的话,那么这应该是:
struct Cars (*ParkingLot)[10] = malloc(FloorCount * sizeof *ParkingLot);
ParkingLot
是一个指向10 Cars
数组的指针(不是指向Cars
的10个指针;而是依次为10 Cars
。 sizeof *ParkingLot
将计算持有许多连续Cars
结构的内存要求,最后,乘以FloorCount
将为您提供许多车辆的多个楼层。为了理智,您可以(并且可能应该)使用标准库calloc
中的数组分配器,尽管不是严格需要的。它看起来像这样:
struct Cars (*ParkingLot)[10] = calloc(FloorCount, sizeof *ParkingLot);
有些人发现它更清楚,并且因为零初始化已分配的内存而感到津津乐道。
关于你的问题,要传递一个真正的数组数组(而不是指针数组),你的函数参数声明是不正确的。
此:
void CarIn (struct Cars *Lot[])
声明一个struct Cars *
的任意长度数组,实际上上面的内容相当于:
void CarIn (struct Cars **Lot)
如果您的意图是传递真正的数组(这是您的分配确实正在获取),那么您希望不。相反,你想要这样的东西:
void CarIn (struct Cars Lot[][10])
或等效地,这:
void CarIn (struct Cars (*Lot)[10])
要将真正的数组数组传递给函数,所有维度,但必须在声明中提供最高级别。上面声明了Cars
的element-count-10数组的任意长度数组。
注意:如果数组下层维度的大小是运行时生成的,那么也可以使用可变长度语法完成,但这似乎不是你的问题(然而)。现在,上面的内容可以让你到达目的地。
祝你好运。