在 C 中将多维数组作为参数传递

Passing a multidimensional array as an argument in C

我正在尝试在辅助函数中初始化矩阵,但在访问辅助函数内的矩阵时收到警告,我不知道如何修复。我正在阅读有关多维数组的内容,甚至在多个示例中看到了用于传递和访问矩阵的相同表示法,但我生成了一个警告,我不太清楚为什么。

据我所知,这个错误意味着参数不是函数期望的类型,但在将初始化重定位到它自己的函数之前,我在主函数中使用它很好。这让我觉得我在将矩阵传递给辅助函数时做错了什么。

passing argument 1 of 'memmove' makes pointer from integer without a cast [-Wint-conversion] 

这是我的初始化程序代码。 p 是指向数组内数据的指针,我想将其初始化到我的矩阵中。我正在使用这种类型的嵌套 for 循环将来自 p 的 16 字节数据传播到我的矩阵中,每个单元格 1 字节。

void initialize(const unsigned char *p, unsigned char (*matrix)[4]) {

   for (unsigned int i = 0; i < 4; i++){
       for (unsigned int j = 0; j < 4; j++){
           memmove(matrix[i][j], p + (4*i+j), 1);    <--- Warning here
       };
   };
};

正在另一个函数中调用 Initialize,如下所示:

void func(const unsigned char *p) {
    unsigned char matrix[4][4] = {
        {0x0,0x0,0x0,0x0},
        {0x0,0x0,0x0,0x0},
        {0x0,0x0,0x0,0x0},
        {0x0,0x0,0x0,0x0}
    };
    initialize(p, matrix);
};

函数memmove()接受一个指针作为第一个参数。 matrix[i][j]char,是整数族的一种类型。将常量 0 以外的整数赋值给指针需要强制转换。否则会发出警告。

因此,我希望为了复制单个 char,您应该将 指针 传递给元素 matrix[i][j]。指针是通过将 & 运算符应用于对象而形成的。

memmove(&matrix[i][j], p + (4*i+j), 1);

但是它可以写​​得更简单、更易读并且可能更优化:

matrix[i][j] = p[4 * i + j];

或者甚至不带任何循环地复制整个数组:

memmove(matrix, p, 16);

passing argument 1 of 'memmove' makes pointer from integer without a cast [-Wint-conversion]

而不是传递整数 作为目标:

unsigned char (*matrix)[4]
...
//         v----------v This is an integer of type unsigned char   
// memmove(matrix[i][j], p + (4*i+j), 1);

将整数的地址作为目的地传递:

memmove(&matrix[i][j], p + (4*i+j), 1);
//      ^-----------^ This is an address

void *memmove(void *s1, const void *s2, size_t n); 期望 s1 是一个地址。


matrix in func() 一个矩阵,又名“二维数组”。

initialize() 中的

matrix 并不是真正的 矩阵 ,而是指向 unsigned chararray[4] 的指针。


自 C99 及之后选择性地,代码可以使用可变长度数组表示法。

void initialize(size_t rows, size_t cols, unsigned char (*m)[rows][cols],
    const unsigned char *p) {
  printf("%zu %zu %zu\n", rows, cols, sizeof *m);
  for (size_t r = 0; r < rows; r++){
    for (size_t c = 0; c < cols; c++){
      (*m)[r][c] = *p++;
    }
  }
}


#define ROW 5
#define COL 7
int main(void) {
  unsigned char matrix[ROW][COL];
  unsigned char bytes[sizeof matrix] = "Something abcde fghij klmno pqrst uvwxy z";

  size_t r = sizeof matrix / sizeof matrix[0];
  size_t c = sizeof matrix[0] / sizeof matrix[0][0];
  printf("%zu %zu %zu\n", r, c, sizeof matrix);
  initialize(r, c, &matrix, bytes);
}