我试图创建一个多维数组,其中只有一次出现的随机值。
void fillRows(int m, int n, int r[m][n]) {
time_t t;
srand((unsigned)time(&t));
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
temp = 1;
while (temp == 1) {
r[i][j] = (rand() % 35 + 1);
printf(" r[i][j] = %d ,", r[i][j]);
if (alreadyInRow(m, n, r, r[i][j]) != 1) {
temp = 0;
}
}
}
printf("\n");
}
}
int alreadyInRow(int k, int l, int ra[k][l], int e) {
printf("hej! ,");
printf("e = %d ,", e);
for (int n = 0; n <= l; n++) {
printf(" ra[i][j] = %d ", ra[k][n]);
if (ra[k][n] == e) {
return 1;
}
}
return 0;
}
int main(int argc, char **argv) {
int rows[3][7] = {
{0, 0, 0, 0, 0, 0, 0}, {1, 2, 3, 4, 5, 6, 7}, {8, 9, 10, 11, 12, 13, 14}};
fillRows(3, 7, rows);
}
但是当我运行代码时,我得到以下内容:
"r[i][j] = 4 ,hej! ,e = 4 , ra[i][j] = 32767, ra[i][j] = 423166060 ra[i][j] = 1536635611 ra[i][j] = 1550322336 ra[i][j] = 32767 ra[i][j] = -814317003 ra[i][j] = 32767 ra[i][j] = 0 r[i][j] = 26 ,hej! ,e = 26 , ra[i][j] = 32767 ra[i][j] = 423166060 ra[i][j] = 1536635611 ra[i][j] = 1550322336 ra[i][j] = 32767 ra[i][j] = -814317003 ra[i][j] = 32767 ra[i][j] = 0 r[i][j] = 28, etc etc etc"
所以当我将数组从函数fillRows()传递给函数isAlreadyInRow()时,数组似乎不遵循?
答案 0 :(得分:1)
问题在于这个功能:
int alreadyInRow(int k, int l, int ra[k][l], int e) {
// [...]
if (ra[k][n] == e)
// [...]
}
您将k
作为行数传递,然后尝试访问ra[k][n]
行中的k+1
元素,它是一个访问权限超出范围。
从函数名称,您只想检查当前行中的元素。您可以使用参数k
,因为无需传递可变长度数组的第一个维度。在调用此函数时,只需将当前行传递给k
即可,但它在概念上是错误的,因为您的代码将读取为数组只有k
行。但是如果你改变这样的签名:
int alreadyInRow(int k, int l, int ra[][l], int e)
(注意k
不再用作维度),这是正确的。
尽管如此,我建议您开始使用有意义的变量和参数名称,它们可以帮助您自己搜索错误以及其他人阅读和理解您的代码。我会建议这样的事情:
int alreadyInRow(int cols, int array[][cols], int row, int element)
最后,如果您只想检查一行,则无需将指针传递给整个2d数组,指向单行的指针就足够了,因此您的函数可能看起来像这样:
int alreadyInRow(int *array, int col, int element) {
for (int n = 0; n < col; ++n) {
if (array[n] == element) {
return 1;
}
}
return 0;
}
您可以从其他功能中将其称为:
if (alreadyInRow(r[i], j, r[i][j]) != 1)