char *(* vehicle)[] [5];动态分配

时间:2014-09-20 15:06:47

标签: c pointers dynamic-memory-allocation

我正在尝试为C中的以下内容动态分配空间,我想知道是否有人可以解释如何? char *(* vehicle)[] [5];

5个元素是车辆的细节,第一个阵列是针对不同的车辆。所以我试图动态地为不同的车辆分配空间,numVehicles和每个有5个点的字符串细节。执行下面的代码只会分配行,但由于定义了5个指定,我需要多次分配我的车辆数量吗?另外,这个数据类型来自api,所以我遗憾的是无法改变它而且我不确定类型的车辆,我的印象是变量名称。

目前我在做:

char* (*vehicle)[][5];

vehicle = malloc(sizeof(char*) * numVehicles);

这似乎在代码中起作用,但我觉得我没有正确地进行分配。

2 个答案:

答案 0 :(得分:2)

由于这是指向char *指针的2D数组的指针,其中次要维度为5,主要维度是动态的,大概等于numVehicles,因此它很可能是:

vehicle = malloc(sizeof(char*) * numVehicles * 5);

答案 1 :(得分:1)

您的分配显然不正确,因为它没有考虑您指针所指向的数组类型中的5。如果您的代码通过自己的错误“补偿”分配错误,那么它似乎可以在代码中工作。不使用5提供的任何额外内存。我们没有看到你的其他代码,这就是为什么没有办法说出它为何起作用的原因。

无论如何,你可以通过

分配它
vehicle = malloc(numVehicles * sizeof **vehicle);

sizeof **vehicle会给你sizeof(char *[5]))。

现在您可以访问数组元素

(*vehicle)[vehicle_index][0] = "Ford Focus";
(*vehicle)[vehicle_index][1] = "ABS";
(*vehicle)[vehicle_index][2] = "Sunroof";
...

但是,您希望将vehicle作为指向未指定大小数组的指针,这就是您vehicle的声明方式,这很奇怪。它会起作用,但似乎不必要地过于复杂。如果您有选择,将vehicle声明为

会更有意义
char *(*vehicle)[5];

并将其分配为

vehicle = malloc(numVehicles * sizeof *vehicle);

在这种情况下,您也可以将其作为

访问
vehicle[vehicle_index][0] = "Ford Focus";
vehicle[vehicle_index][1] = "ABS";
vehicle[vehicle_index][2] = "Sunroof";
...

比前一个例子更复杂。