C语言将多维数组作为函数参数传递时出现类型警告如何解决
问题根因
你触发警告的核心原因是memmove函数的参数类型传错了,和矩阵传递的逻辑无关:
- 你之前判断问题出在矩阵传递环节是误判,
unsigned char (*matrix)[4]接收二维数组、调用时传入matrix(数组名自动退化为第一行指针)的语法完全正确 memmove的第一个参数要求是目标内存的起始地址(指针类型),你写的matrix[i][j]是取出二维数组对应位置的unsigned char类型整数值,不是指针,编译器自然会报「把整数转成指针没有类型转换」的警告。
修复方案
仅需要给报错行的matrix[i][j]增加取地址符&,拿到元素的内存地址传给memmove即可,修改后代码如下:
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); } } }
因为你每次仅拷贝1字节,不需要调用memmove,直接赋值写法更简洁、执行效率更高:
matrix[i][j] = p[4*i + j];
额外优化方案
4x4的unsigned char矩阵是连续内存布局,不需要嵌套循环逐个拷贝,直接一次性拷贝16字节即可,代码更简洁性能也更好:
void initialize(const unsigned char *p, unsigned char (*matrix)[4]) { memmove(matrix, p, 16); }
内容的提问来源于stack exchange,提问作者Darkonode
相关产品推荐
相关产品推荐

