C语言:如何通过动态内存分配初始化二维字符数组并读取表格文件?
问题分析与解决方案
1. 数组初始化的核心错误
你一开始声明的char tableArray[ROWS][COLS];是全局数组,程序启动时就会自动在全局内存区分配空间,完全不需要额外的malloc操作。你后面写的int** tableArray;属于重复声明变量,而且类型还不匹配(你需要的是char类型数组,不是int),这才导致了'tableArray' does not name a type的编译错误。
2. 修复后的完整可运行代码
直接删掉错误的动态分配代码,同时修正copyTable函数里的逻辑问题:
#include <stdio.h> #define ROWS 3 #define COLS 3 // 全局二维字符数组,已自动分配内存,无需手动初始化 char tableArray[ROWS][COLS]; void copyTable() { FILE *fp = fopen("table.txt", "r"); if (fp == NULL) { printf("No file found.\n"); return; } char c; int currentRow, currentCol; for (currentRow = 0; currentRow < ROWS; currentRow++) { currentCol = 0; while (currentCol < COLS) { c = fgetc(fp); // 跳过所有空白字符:空格、换行、回车 if (c == ' ' || c == '\n' || c == '\r') { continue; } // 读取到有效字符,存入数组后列索引自增 tableArray[currentRow][currentCol] = c; currentCol++; } } fclose(fp); // 必须关闭文件,避免资源泄漏 } // 测试用例:打印数组验证结果 int main() { copyTable(); for (int i = 0; i < ROWS; i++) { for (int j = 0; j < COLS; j++) { printf("%c ", tableArray[i][j]); } printf("\n"); } return 0; }
3. 原代码中的其他问题修正
- 错误的字符跳过逻辑:你原来在循环里直接调用
fgetc(fp)跳过换行,会导致跳过的字符不可控(比如元素间的空格、多行换行都没处理),改成用continue跳过所有空白字符更可靠。 - 数组越界赋值:
tableArray[ROWS][COLS] = '\0';是完全错误的——数组索引从0开始,ROWS和COLS对应的位置已经超出数组内存范围,会触发未定义行为,必须删掉。 - 未关闭文件:打开文件后必须调用
fclose(fp)释放文件资源,否则会造成资源泄漏。
4. 动态分配的补充(针对可变大小表格)
如果之后需要处理行数/列数不固定的表格,才需要用动态分配,正确的char类型二维数组动态分配代码如下(注意不要和全局数组重复声明):
#include <stdio.h> #include <stdlib.h> #define ROWS 3 #define COLS 3 char** tableArray; // 声明为指向指针的指针 // 初始化动态二维数组 void initTable() { // 分配行指针数组 tableArray = (char**)malloc(ROWS * sizeof(char*)); if (tableArray == NULL) { printf("Memory allocation failed.\n"); exit(1); } // 为每一行分配列内存 for (int i = 0; i < ROWS; i++) { tableArray[i] = (char*)malloc(COLS * sizeof(char)); if (tableArray[i] == NULL) { printf("Memory allocation failed.\n"); // 提前释放已分配的内存,避免泄漏 for (int j = 0; j < i; j++) { free(tableArray[j]); } free(tableArray); exit(1); } } } // 使用完后释放动态分配的内存 void freeTable() { for (int i = 0; i < ROWS; i++) { free(tableArray[i]); } free(tableArray); }
使用时需要先调用initTable()初始化内存,使用完毕后调用freeTable()释放资源。
内容的提问来源于stack exchange,提问作者BarackBarackBarack
相关产品推荐
相关产品推荐

