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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 04:00:02