在 C 中打印矩阵时变量改变值

Variables changing values while printing matrices in C

我正在尝试编写一个程序来计算矩阵的行列式。我问用户他们想要的矩阵的大小和矩阵元素的值。每当我尝试打印矩阵时,保存矩阵大小的变量值都会发生奇怪的变化,我最终会打印出一大堆随机值。这似乎只有在输入的大小超过 4 时才会发生。这是我的代码:

#include <stdio.h>
#define MAX 20

void fillMatrix(int b[][MAX], int size);
void printMatrix(int b[][MAX], int size);

int main(){

    //size of the matrix
    int size;

    //user inputs size of matrix
    printf("What size? ");
    scanf(" %d", &size);

    //declare matrix
    int matrix[size][size];

    //fill matrix and print it
    fillMatrix(matrix, size);
    printMatrix(matrix, size);

}

//fill matrix
void fillMatrix(int b[][MAX], int size){
    for (int i = 0; i < size; i++){
        for (int j = 0; j < size; j++){
            printf("Element %d, %d: ", i, j);
            scanf(" %d", &b[i][j]);
        }
    }
}

//prints matrix
void printMatrix(int b[][MAX], int size){
    
    printf("\nYour matrix: Size is: %d \n\n", size);

    for (int i = 0; i < size; i++){
        for (int j = 0; j < size; j++){
            printf("%-5d", b[i][j]);
        }
        printf("\n");
    }
}

这是我得到的输出,非常奇怪。每当我 运行 程序 'size' 变量更改为一个新的随机值(这次它决定它想要是 14):

What size? 5
Element 0, 0: 1  
Element 0, 1: 2  
Element 0, 2: 3
Element 0, 3: 4
Element 0, 4: 5
Element 1, 0: 6
Element 1, 1: 7
Element 1, 2: 8
Element 1, 3: 9
Element 1, 4: 10
Element 2, 0: 11
Element 2, 1: 12
Element 2, 2: 13
Element 2, 3: 14
Element 2, 4: 15
Element 3, 0: 16
Element 3, 1: 17
Element 3, 2: 18
Element 3, 3: 19
Element 3, 4: 20
Element 4, 0: 21
Element 4, 1: 22
Element 4, 2: 23
Element 4, 3: 24
Element 4, 4: 25

Your matrix: Size is: 14 

1    2    3    4    5    0    0    0    83666196832767-1154713840325690    0    
6    7    8    9    10   0    41957330    194  0    83642160032767-11569205121    
11   12   13   14   15   0    -1167000585325691    0    83642200832767327681    
16   17   18   19   20   0    0    0    426856809-15535752972138001769-15616396370    32767
21   22   23   24   25   0    0    0    0    0    41954400    83642200032767
1    0    836428099327670    0    83642810632767836428255327678364283383276783642842332767
83642849532767836428517327678364286073276783642862432767836428643327678364287843276783642892232767
83642913432767836430278327678364304723276783643048932767836430553327678364308953276783643094032767
83643171232767836431732327678364317403276783643176032767836431772327678364318093276783643183332767
16   0    5292677110    6    0    4096 0    17   0    100  0    3    0    
5    0    9    0    7    0    -1156988928325698    0    0    0    9    0    
12   0    1000 0    13   0    1000 0    14   0    1000 0    23   0    
26   0    2    0    31   0    8364318573276715   0    836422649327670    0    
-448521986-126364567290967056834217910    0    0    0    0    0    0    0    0    0  

void fillMatrix(int b[][MAX], int size);void printMatrix(int b[][MAX], int size); 声明这些例程具有一个参数,该参数是 MAX int 数组的数组。 (该参数自动调整为指针而不是数组,但这不是问题。)

main中,int matrix[size][size];matrix定义为sizesizeint数组的数组。您稍后将 matrix 传递给那些例程。这是一个错误,因为 matrixsize int 的数组,而不是 MAX int 的数组。因此函数中的寻址会出错并破坏程序中的其他数据。

在函数参数中使用您在 main 中定义的数组中使用的相同类型,反之亦然。 (要声明一个大小基于 size 而不是 MAX 的数组,请将 size 作为第一个参数而不是最后一个。)

你告诉 fillMatrixprintMatrix 数组是一个 int[][MAX],但是你声明了一个 int[size][size],它更小——每行只包含 5 个整数而不是 20。因为您实际分配的数组比 fillMatrix 认为的要小,fillMatrix 正在写入数组末尾并破坏其他内存——结果是未定义的行为,但是发生了什么你的情况是你输入的值之一(14)最终覆盖了 size 变量。

您需要在 main 中将矩阵声明为 int matrix[MAX][MAX]int matrix[size][MAX] 以便行间距正确 — 或者您可以使用可变长度数组声明 void fillMatrix(int size, int matrix[size][size])(注意更改参数顺序,使 size 先出现)。