C语言二维数组读取文件后输出异常问题求助
问题:读取矩阵后二维数组内容异常
我正在编写一个从文件读取矩阵并存储到二维数组的C程序。文件能成功打开,读取数据时打印的内容看似正确,但后续打印二维数组内容时结果却不正确,且我并未修改过该数组。
程序代码
#include <stdio.h> int main (void){ char key_file_name[20]; char plaintext_file_name[20]; FILE *key_ptr = NULL; FILE *plaintext_ptr = NULL; int matrix_size; int matrix[matrix_size][matrix_size]; printf("key file: "); scanf("%s" , key_file_name); printf("plaintext file name: "); scanf("%s" , plaintext_file_name); key_ptr = fopen(key_file_name , "r"); fscanf(key_ptr , "%d" , &matrix_size); printf("matrix size: %d\n" , matrix_size); for(int i = 0 ; i < matrix_size ; ++i){ for(int j = 0 ; j < matrix_size ; ++j){ fscanf(key_ptr , "%d" , &matrix[i][j]); printf("%d" , matrix[i][j]); } printf("\n"); } fclose(key_ptr); printf("matrix size: %d\n" "%d%d\n" "%d%d\n" , matrix_size , matrix[0][0] , matrix[0][1] , matrix[1][0] , matrix[1][1]); return 0; }
输入文件k1.txt内容
2 2 4 3 5
实际输出
key file: k1.txt plaintext file name: p1.txt matrix size: 2 24 35 matrix size: 2 35 35
期望输出
key file: k1.txt plaintext file name: p1.txt matrix size: 2 24 35 matrix size: 2 24 35
问题根源
核心问题是变长数组(VLA)的声明时机错误:
- 声明
int matrix[matrix_size][matrix_size];时,matrix_size还未初始化,是一个随机的垃圾值,导致数组的实际大小完全不确定。 - 后续读取
matrix_size为2后,数组的内存布局已经固定,写入数据时会出现内存越界,破坏数组本身或其他变量的内容,最终导致打印结果异常。
修复方案
将变长数组的声明移到读取matrix_size之后,确保数组大小是明确的:
#include <stdio.h> int main (void){ char key_file_name[20]; char plaintext_file_name[20]; FILE *key_ptr = NULL; FILE *plaintext_ptr = NULL; int matrix_size; printf("key file: "); scanf("%s" , key_file_name); printf("plaintext file name: "); scanf("%s" , plaintext_file_name); key_ptr = fopen(key_file_name , "r"); // 增加文件打开失败的检查 if(key_ptr == NULL) { printf("Failed to open key file\n"); return 1; } // 先读取matrix_size if(fscanf(key_ptr , "%d" , &matrix_size) != 1) { printf("Failed to read matrix size\n"); fclose(key_ptr); return 1; } printf("matrix size: %d\n" , matrix_size); // 此时再声明变长数组 int matrix[matrix_size][matrix_size]; for(int i = 0 ; i < matrix_size ; ++i){ for(int j = 0 ; j < matrix_size ; ++j){ if(fscanf(key_ptr , "%d" , &matrix[i][j]) != 1) { printf("Failed to read matrix element\n"); fclose(key_ptr); return 1; } printf("%d" , matrix[i][j]); } printf("\n"); } fclose(key_ptr); printf("matrix size: %d\n" "%d%d\n" "%d%d\n" , matrix_size , matrix[0][0] , matrix[0][1] , matrix[1][0] , matrix[1][1]); return 0; }
额外建议
- 每次调用
fopen、fscanf后都检查返回值,能快速定位文件操作或读取失败的问题。 - 如果你的编译器不支持C99标准的变长数组,可以使用动态内存分配:
int **matrix = malloc(matrix_size * sizeof(int*)); for(int i=0; i<matrix_size; i++) { matrix[i] = malloc(matrix_size * sizeof(int)); } // 使用完后记得释放内存 for(int i=0; i<matrix_size; i++) { free(matrix[i]); } free(matrix);
内容的提问来源于stack exchange,提问作者Lena_Bean
相关产品推荐
相关产品推荐

