在 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 char
的 array[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);
}
我正在尝试在辅助函数中初始化矩阵,但在访问辅助函数内的矩阵时收到警告,我不知道如何修复。我正在阅读有关多维数组的内容,甚至在多个示例中看到了用于传递和访问矩阵的相同表示法,但我生成了一个警告,我不太清楚为什么。
据我所知,这个错误意味着参数不是函数期望的类型,但在将初始化重定位到它自己的函数之前,我在主函数中使用它很好。这让我觉得我在将矩阵传递给辅助函数时做错了什么。
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 char
的 array[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);
}