我已经用这个创建了一个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;
}
首先,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
的元素计数10阵列的任意长度阵列。
注意:如果次维度数组的大小调整是运行时生成的,那么这个也可以用可变长度语法来完成,但这似乎不是你的问题。目前,以上内容应该会让你达到你想要的目的。
祝你好运。
struct
不创建2D数组,struct
创建一个结构-一个统一不同数据类型并将其作为"统一体"存储在内存中的"模板"
通过int 2Darray[3][4] = {{0,1,2},{8,9,10,11}};
创建2D阵列
结构的2D阵列由struct Cars cars2Darray[10][10];
创建
看看这个http://www.tutorialspoint.com/cprogramming/c_multi_dimensional_arrays.htm
要将2D数组作为参数传递给函数,一种可能的方法是使用指向数组的0元素的指针,即2D_array[0](如果数组名为2D_array)。
在以下内容中,指针'ptr'指向int数组的0元素'1D_array'
int 1D_array[8]= { 1, 2, 4, 8, 16, 32, 64, 128 };
int *ptr;
ptr = 1D_array;
ptr = 1D_array
将1D_array的第0个元素的地址存储在ptr中,因此ptr现在指向1D_array的第0元素
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int 1D_array[8]= { 1, 2, 4, 8, 16, 32, 64, 128 };
int *ptr;
int i;
ptr = 1D_array;
printf("The value, *ptr points to, is %dn", *ptr);
printf("When applying *ptr+1 it points to %dn", *(ptr+1));
printf("*(ptr+3) = %dn", *(ptr+3));
printf("n all elements of 1D_array : n");
for(i=0; i<8; i++)
printf("element[%d]=%d n", i, *(ptr+i));
return EXIT_SUCCESS;
}
由于ptr
现在指向1D_array的第0个元素,因此可以使用它将数组传递给函数。
关于如何将2D数组传递给函数,有3种方法(2种使用指针)请参阅此将二维数组传递到函数的正确方法