【问题标题】:how to pass array as a parameter to a function in C?如何将数组作为参数传递给C中的函数?
【发布时间】:2013-10-24 14:33:16
【问题描述】:

我在 C 中有以下数组:

int format[6][6] = { {1,1,1,1,1,1},
                     {2,2,2,2,2,2},
                     {3,3,3,3,3,3},
                     {4,4,4,4,4,4},
                     {5,5,5,5,5,5},
                     {6,6,6,6,6,6}
}

然后我有一个函数需要将数组format 传递给函数,并将所有数据复制到一个新数组中:

void constructNewArray(int array[6][6])
{
    int newArray[10][10] = {0};
    memcpy(newArray, array, sizeof(int)*6*6);
}

那么constructNewArray函数的参数,是否适合作为参数int array[6][6]?或者如何纠正?

【问题讨论】:

  • 我会讨论任何现实生活中的这种“需求”。
  • void constructNewArray(int **array) 可能是您要找的?
  • 好的,那么将这样的数组传递给函数的正确方法是什么?
  • 你在这里做错了:int newArray[10][10] = {0};
  • “如何改正?”??你甚至没有告诉我们问题是什么!

标签: c arrays function parameters


【解决方案1】:

正如所写,函数中的代码是“OK”;函数定义没问题。正如abelenky 指出的那样,调用代码中的数组初始值设定项中缺少分号。

编译器基本上忽略了数组的前导维度。如果你有 C99 编译器,你可以这样写:

void constructNewArray(int array[static 6][6])

这告诉编译器它可以假设数组中至少有 6 行。我不确定什么时候会真正带来好处,但设施就在那里。

不太清楚的是数据是否以您想要的方式复制到您的 10x10 数组中。实际上,您最终会像您写的那样初始化数组:

int newArray[10][10] =
    { { 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, },
      { 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, },
      { 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, },
      { 6, 6, 6, 6, 6, 6, 0, 0, 0, 0, },
      // ... all zeroes from here onwards
    };

此外,如果您尝试将 10x6 或 2x6 矩阵传递给函数,编译器也不会报错。

就目前而言,您的函数会小心地创建数组并对其进行初始化,然后什么也不做。您不能返回(指向)本地数组。您必须为此进行动态内存分配,或者将新数组作为参数传递给函数,在这种情况下,它变为“从 6x6 数组初始化 10x10 数组”。或者您可以安排从constructNewArray() 函数内部调用具有构造数组的另一个函数,但这对于名为“construct”的函数是不可信的。因此,尚不清楚您的功能是否设计正确。

【讨论】:

  • 所写的代码并不完全“ok”。他的format 数组末尾缺少一个分号。
【解决方案2】:

这个定义是错误的

int format[6][6] = { {1,1,1,1,1,1},
                     {2,2,2,2,2,2},
                     {3,3,3,3,3,3},
                     {4,4,4,4,4,4},
                     {5,5,5,5,5,5},
                     {6,6,6,6,6,6}
}

所有变量声明都以分号结尾。 这应该是:

int format[6][6] = { {1,1,1,1,1,1},
                     {2,2,2,2,2,2},
                     {3,3,3,3,3,3},
                     {4,4,4,4,4,4},
                     {5,5,5,5,5,5},
                     {6,6,6,6,6,6}
};  // <== NOTE the final semi-colon.

【讨论】:

    【解决方案3】:

    试试这个:

    void constructNewArray(int array[][6])
    {
        ...
    }
    

    【讨论】:

      【解决方案4】:

      您用来将数组传递给constructNewArray 的方法是正确的。当传递一个通用的多维数组时,比如说data[a][b]...[x],你应该指定除第一个维度之外的所有维度。例如,您可以像这样声明constructNewArray

      void constructNewArray(int array[][6])
      

      将数组传递给函数的另一种方法是使用指针。

      void constructNewArray(int **array)
      

      您仍然可以通过这种方法在constructNewArray 中使用array[1][2] 之类的索引来访问元素。

      【讨论】:

      • 好的,但是如果我使用 void constructorNewArray(int array[][6]),那么 memcpy(newArray, array, sizeof(int)*6*6); 是否正确像这样?
      • @user2131316 memcpy 不关心你传递给它的东西是否是一个数组。它将从地址array 开始复制sizeof(int)*6*6 字节的数据并将其复制到newArray。你想这样做,这取决于你。
      • 好的,那么在这种情况下,复制数据的正确方法是什么?
      • @user2131316 您需要通过复制数据来阐明您的意思。你希望得到的数组是什么样子的?截至目前,它肯定是在将数据复制到newArray
      • 我必须将作为参数传递的数组中的所有内容复制到此函数内部的新数组 newArray 中
      猜你喜欢
      • 2021-09-15
      • 2016-07-21
      • 2020-03-22
      • 1970-01-01
      • 2012-12-07
      • 2018-09-17
      • 2013-01-25
      相关资源
      最近更新 更多