如何用void函数初始化二维数组?指针传递问题排查
问题分析与修正方案
核心错误点
- 参数类型不匹配:main中定义的
table是char (*)[10](指向包含10个char的数组的指针),但你传给函数的是它的地址(即char (**)[10]类型),而原函数参数声明为char*,类型完全不兼容,会导致未定义的指针操作。 - 值传递陷阱:原函数中直接给
table = A只是修改了函数内部的形参副本,不会影响main里的实参。C语言是值传递,要修改外部的指针变量,必须传递指针的指针。 - 函数名笔误:原函数名
asssignTable多了一个s,虽不影响运行,但属于低级错误,建议修正。
修正后的代码
#include <stdio.h> #include <stdlib.h> char A[10][10] = { {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'}, {'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T'}, {'U', 'V', 'W', 'X', 'Y', 'Z', '.', ',', '!', '?'}, {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'}, {'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T'}, {'U', 'V', 'W', 'X', 'Y', 'Z', '.', ',', '!', '?'}, {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'}, {'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T'}, {'U', 'V', 'W', 'X', 'Y', 'Z', '.', ',', '!', '?'}, {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'} }; char B[10][10] = { {' ', 't', 'a', 'b', 'c', 'f', 'g', 'z', 'j', 'm'}, {' ', 't', 'a', 'b', 'c', 'f', 'g', 'z', 'j', 'm'}, {' ', 't', 'a', 'b', 'c', 'f', 'g', 'z', 'j', 'm'}, {' ', 't', 'a', 'b', 'c', 'f', 'g', 'z', 'j', 'm'}, {' ', 't', 'a', 'b', 'c', 'f', 'g', 'z', 'j', 'm'}, {' ', 't', 'a', 'b', 'c', 'f', 'g', 'z', 'j', 'm'}, {' ', 't', 'a', 'b', 'c', 'f', 'g', 'z', 'j', 'm'}, {' ', 't', 'a', 'b', 'c', 'f', 'g', 'z', 'j', 'm'}, {' ', 't', 'a', 'b', 'c', 'f', 'g', 'z', 'j', 'm'}, {' ', 't', 'a', 'b', 'c', 'f', 'g', 'z', 'j', 'm'} }; void printTable(int rows, int columns, char table[rows][columns]) { for (int i = 0; i < rows; i++) { for (int j = 0; j < columns; j++) printf("%c", table[i][j]); printf("\n"); } printf("\n"); } // 修正参数类型:接收指向二维数组指针的指针 void assignTable(char (**table)[10], char* table_identity) { if (table_identity[0] == 'A') *table = A; // 解引用修改外部的指针变量 else if (table_identity[0] == 'B') *table = B; printf("In the function \"assignTable\":\n"); printTable(10, 10, *table); // 传递解引用后的指针给printTable } int main() { char (*table)[10]; assignTable(&table, "A"); // 传指针的地址 printf("In main :\n"); printTable(10, 10, table); return 0; }
关键修改说明
- 参数类型调整:将函数参数改为
char (**table)[10],明确接收指向char (*)[10]类型指针的地址,解决类型不兼容问题。 - 修改实参而非形参:用
*table = A代替table = A,通过解引用操作直接修改main中table变量的取值,让赋值结果能传递回主函数。 - 修正函数调用:函数内调用
printTable时传递*table,匹配printTable所需的二维数组指针类型。
内容的提问来源于stack exchange,提问作者3nondatur
相关产品推荐
相关产品推荐

