函数参数传递二维字符数组时遍历失败问题排查
二维字符数组作为函数参数传递的遍历问题
问题描述
直接在main函数中遍历二维字符数组可正常输出B10A12D21,但将数组传递给自定义func()函数后遍历,返回空结果。
异常代码
void func(char *arr[]) { for (int i = 0; i < 3; i++) { printf("%s", arr[i]); } } int main() { char arr[3][5] = {"B10","A12", "D21"}; func(arr); return 0; }
正常代码
int main() { char arr[3][5] = {"B10","A12", "D21"}; for (int i = 0; i < 3; i++){ printf("%s", arr[i]); } return 0; }
问题根源
char arr[3][5]是二维字符数组,内存中连续存储。传递给char *arr[]类型参数时,类型不匹配:
char *arr[]是指针数组,每个元素指向单个char;而二维数组传递时会退化为指向一维数组的指针(char (*arr)[5])。- 指针类型不匹配导致
arr[i]的内存偏移计算错误,访问了非法内存,因此输出为空。
解决办法
方法1:使用指向一维数组的指针
将函数参数改为指向长度为5的字符数组的指针:
void func(char (*arr)[5]) { for (int i = 0; i < 3; i++) { printf("%s", arr[i]); } } int main() { char arr[3][5] = {"B10","A12", "D21"}; func(arr); return 0; }
方法2:声明完整的二维数组维度
直接在函数参数中指定二维数组的行列数:
void func(char arr[3][5]) { for (int i = 0; i < 3; i++) { printf("%s", arr[i]); } } int main() { char arr[3][5] = {"B10","A12", "D21"}; func(arr); return 0; }
方法3:改用指针数组(适用场景允许时)
如果可以修改数组定义,将二维数组改为指针数组,匹配char *arr[]参数:
void func(char *arr[]) { for (int i = 0; i < 3; i++) { printf("%s", arr[i]); } } int main() { char *arr[] = {"B10","A12", "D21"}; func(arr); return 0; }
内容的提问来源于stack exchange,提问作者Mr Habibbi
相关产品推荐
相关产品推荐

