-1

我在 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

4 回答 4

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”的函数来说是不可信的。因此,尚不清楚您的功能是否设计正确。

于 2013-10-24T14:44:54.450 回答
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.
于 2013-10-24T14:48:05.453 回答
0

试试这个:

void constructNewArray(int array[][6])
{
    ...
}
于 2013-10-24T14:41:06.973 回答
0

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

void constructNewArray(int array[][6])

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

void constructNewArray(int **array)

您仍然可以使用这种方法array[1][2]在内部使用索引来访问元素。constructNewArray

于 2013-10-24T14:43:40.820 回答