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

C语言入门问题:如何将二维字符串数组传入函数并正确打印?

问题修复方案

核心错误原因

  • 形参类型不匹配:你定义的arr1是char *[3][3]类型(3行3列的二维字符指针数组,每个元素为指向字符串的char*),但原函数形参char *in[]等价于char **,仅能匹配一维字符指针数组,无法接收二维数组。
  • 传参逻辑错误:原代码中取单个字符串地址&j传入函数,仅传递了第一个字符串的地址,并未传入整个二维数组,访问越界触发段错误。
  • 打印格式错误:in[i][j]本身就是指向字符串的char*类型,应该用%s格式符打印,用%c只会读取字符串首地址对应的单个字符,后续访问完全越界。

修改后可运行代码

#include <stdio.h>

// 形参声明为指向长度为3的char*数组的指针,匹配二维数组退化为行指针的规则
void printArray(char *(*in)[3], int row, int col){
    int i;
    int j;
    for (i = 0; i < row; i++){
        for (j = 0; j < col; j++){
            // 每个元素是char*字符串,用%s打印
            printf("%s ", in[i][j]);
        }
        printf("\n");
    }
}

int main(){
    char *arr1[3][3];
    arr1[0][0] ="Hello";
    arr1[0][1] = "World";
    arr1[0][2] = "Today";
    arr1[1][0] = "Is";
    arr1[1][1] = "September";
    arr1[1][2] = "28";
    arr1[2][0] = "th";
    arr1[2][1] = "2021";
    arr1[2][2] = "yay";
    printf("Before: \n");
    // 直接传二维数组名,自动退化为指向首行的指针
    printArray(arr1, 3, 3);
    return 0;
}

代码说明

  • 形参char *(*in)[3]也可以直接写成char *in[3][3],C语言处理函数形参时会自动将数组声明调整为对应指针类型,两种写法等价。
  • 额外添加了行数、列数参数,提升函数通用性,避免硬编码3的限制。
  • 运行后会按行打印所有字符串,不会出现段错误和格式不匹配警告。

内容的提问来源于stack exchange,提问作者user14689794

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 10:24:01