You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

函数参数传递二维字符数组时遍历失败问题排查

二维字符数组作为函数参数传递的遍历问题

问题描述

直接在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 00:10:23