在 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
定义为size
size
int
数组的数组。您稍后将 matrix
传递给那些例程。这是一个错误,因为 matrix
是 size
int
的数组,而不是 MAX
int
的数组。因此函数中的寻址会出错并破坏程序中的其他数据。
在函数参数中使用您在 main
中定义的数组中使用的相同类型,反之亦然。 (要声明一个大小基于 size
而不是 MAX
的数组,请将 size
作为第一个参数而不是最后一个。)
你告诉 fillMatrix
和 printMatrix
数组是一个 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
先出现)。
我正在尝试编写一个程序来计算矩阵的行列式。我问用户他们想要的矩阵的大小和矩阵元素的值。每当我尝试打印矩阵时,保存矩阵大小的变量值都会发生奇怪的变化,我最终会打印出一大堆随机值。这似乎只有在输入的大小超过 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
定义为size
size
int
数组的数组。您稍后将 matrix
传递给那些例程。这是一个错误,因为 matrix
是 size
int
的数组,而不是 MAX
int
的数组。因此函数中的寻址会出错并破坏程序中的其他数据。
在函数参数中使用您在 main
中定义的数组中使用的相同类型,反之亦然。 (要声明一个大小基于 size
而不是 MAX
的数组,请将 size
作为第一个参数而不是最后一个。)
你告诉 fillMatrix
和 printMatrix
数组是一个 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
先出现)。