我在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]
是否适合作为参数?或者如何纠正它?
答案 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
之类的索引来访问元素。