将多维数组传递给将其传递给C中的另一个函数的函数时错误

时间:2017-11-21 17:41:08

标签: c multidimensional-array

我试图创建一个多维数组,其中只有一次出现的随机值。

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()时,数组似乎不遵循?

1 个答案:

答案 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)