如何将2D数组发送到函数?

时间:2016-04-09 07:17:17

标签: c function multidimensional-array malloc

我用这个创建了一个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;
}

1 个答案:

答案 0 :(得分:1)

首先,您的大小调整在ParkingLot的分配声明中是错误的。我假设你想要每层10辆汽车和任意数量的楼层,如果是这样的话,那么这应该是:

struct Cars (*ParkingLot)[10] = malloc(FloorCount * sizeof *ParkingLot);

ParkingLot是一个指向10 Cars数组的指针(不是指向Cars的10个指针;而是依次为10 Carssizeof *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数组的任意长度数组。

注意:如果数组下层维度的大小是运行时生成的,那么也可以使用可变长度语法完成,但这似乎不是你的问题(然而)。现在,上面的内容可以让你到达目的地。

祝你好运。