【问题标题】:How to send 2D array to a function?如何将二维数组发送到函数?
【发布时间】:2016-04-09 07:17:17
【问题描述】:

我用这个创建了一个二维数组:

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;
}

【问题讨论】:

    标签: c function multidimensional-array malloc


    【解决方案1】:

    首先,ParkingLot 的分配声明中的大小错误。我假设您希望每层有 10 辆汽车和任意数量的楼层,如果是这种情况,那么应该这样做:

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

    ParkingLot 是一个指向 10 个 Cars 数组的指针(不是 10 个指向 Cars 的指针;而是依次排列的 10 个 Cars)。 sizeof *ParkingLot 将计算保存那么多连续的Cars 结构的内存需求,最后乘以FloorCount 将得到那么多楼层,那么多汽车。出于理智的考虑,您可以(并且可能应该)使用标准库 calloc 中的 array allocator,尽管它并不是绝对需要的。它看起来像这样:

    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])
    

    要将真正的数组数组传递给函数,所有维度,但必须在声明中提供最高维度。上面声明了一个任意长度的数组,由元素计数为 10 的 Cars 数组组成。

    注意:如果数组次维度数组的大小是运行时生成的,那么这个 可以 也可以使用可变长度语法来完成,但这似乎不是你的问题(然而)。目前,以上内容应该可以让您到达您想去的地方。

    祝你好运。

    【讨论】:

      【解决方案2】:

      struct 不创建二维数组,struct 创建一个结构——一个'模板',它统一了不同的数据类型并将它们作为一个'统一'存储在内存中

      一个二维数组是由int 2Darray[3][4] = {{0,1,2},{8,9,10,11}};创建的

      结构的二维数组由struct Cars cars2Darray[10][10];创建

      看到这个http://www.tutorialspoint.com/cprogramming/c_multi_dimensional_arrays.htm

      要将二维数组作为参数传递给函数,一种可能的方法是使用指向数组第 0 元素的指针,即 2D_array[0](如果数组名为 2D_array).

      下面的指针'ptr'指向int-array的第0个元素'1D_array'

      int 1D_array[8]= { 1, 2, 4, 8, 16, 32, 64, 128 };
      int *ptr; 
      ptr = 1D_array;
      

      ptr = 1D_array1D_array 的第 0 个元素的地址存储在 ptr 中,因此 ptr 现在指向第 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 %d\n", *ptr);
         printf("When applying *ptr+1 it points to %d\n", *(ptr+1));
         printf("*(ptr+3) = %d\n", *(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 种使用指针)参见此 Correct way of passing 2 dimensional array into a function

      【讨论】:

      • 如您所见,我需要创建一个二维结构数组,并且由于我使用malloc 来创建它,因此我已经有一个指向该数组的指针。我已经设法使用该功能进行打印,我只需要添加&amp; 但现在我有另一个问题..
      • 我没明白这是一种创建数组struct Cars (*ParkingLot)[10] = malloc(FloorCount * sizeof *ParkingLot);动态内存分配方法
      猜你喜欢
      • 1970-01-01
      • 2010-12-22
      • 1970-01-01
      • 2017-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多