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
相关产品推荐
相关产品推荐

