如何将数组作为参数传递给C中的函数?

时间:2013-10-24 14:33:16

标签: c arrays function parameters

我在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]是否适合作为参数?或者如何纠正它?

4 个答案:

答案 0 :(得分:2)

如上所述,函数中的代码为“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'的函数来说是不可信的。因此,目前尚不清楚您的功能是否设计得恰当。

答案 1 :(得分:1)

此定义为 错误

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.

答案 2 :(得分:0)

试试这个:

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

答案 3 :(得分:0)

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

void constructNewArray(int array[][6])

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

void constructNewArray(int **array)

您仍然可以使用此方法在array[1][2]内使用constructNewArray之类的索引来访问元素。