简介
我遇到了一个奇怪的问题,我写了下面的代码,要求用户一个矩阵,程序要求的大小,然后在矩阵中的元素。
然后,我再次迭代矩阵,计算每行的max
和min
,以及主对角线上元素的和。
我写这个程序以后翻译到汇编,这就是为什么我使用指针为我的矩阵,以保持程序最接近,因为它将在汇编
#include <stdlib.h>
#include <stdio.h>
int main(){
int rows, cols;
int *matrix;
int *max, *min, diag, num;
// Input matrix
printf("Rows number: ");
scanf("%d", &rows);
printf("Cols number: ");
scanf("%d", &cols);
// Alloc matrix
matrix = malloc(rows*cols);
max = malloc(rows);
min = malloc(rows);
// Fill matrix
for (int i=0; i<rows; i++)
for (int j=0; j<cols; j++){
printf("[%d, %d] = ", i, j);
scanf("%d", matrix+(i*cols)+j); // Store at offset
}
diag = 0;
for (int i=0; i<rows; i++){
max[i] = matrix[i*cols]; // Assume 1st is max
min[i] = matrix[i*cols]; // Assume 1st is min
for (int j=0; j<cols; j++){
num = *(matrix+(i*cols)+j); // Store num of the matrix temporaly for fast access
if (i == j) diag += num; // If in main diagonal, add to diag sum
if (num > max[i]) max[i] = num;
else if (num < min[i]) min[i] = num;
}
}
printf("\nDEBUG for [2,2] value %d\n\n", matrix[8]);
for (int i=0; i<rows; i++){
for (int j=0; j<cols; j++){
printf("%d ", *(matrix+(i*cols)+j));
}
printf("| max=%d, min=%d", max[i], min[i]);
printf("\n");
}
printf("\nDiagonal sum = %d", diag);
return 0;
}
3x3输入屏幕截图
4x4输入屏幕截图
问题
当我键入一个3x3矩阵的元素,其中从1到9的元素作为矩阵值时,最后一个元素出错,显示值3
而不是9
。
我试过其他输入,错误似乎是从第一行,第三列复制值。
这让我抓狂,因为当我用调试器运行它时,程序按预期工作。
解决方案
如果我将矩阵定义为数组(int matrix[i][j]
)或max
和min
数组,问题就解决了,但这不是我想要的解决方案。
另外,如果我给矩阵分配一些额外的空间,问题就消失了。同样,一个不需要的解决方案。
假设
我认为,除了我搞砸了一些事情之外,对malloc(max = malloc(rows)
)的第二次调用正在分配数组,覆盖了前一次malloc调用,即在前一行中分配矩阵的调用。
注意事项
感谢大家的帮助,联系我的额外信息有关的问题
1条答案
按热度按时间ljo96ir51#
解决方法在理解底层问题方面是正确的,它是关于空间的。
多少字节?如果一个
int
占用一个字节的内存,那么答案是rows * cols
(这就是你现在所在的位置)。但事实并非如此,一个int
实际上占用两个字节或四个字节(通常是四个,但这取决于编译器)。使用sizeof
来确定int
的大小,并将其纳入计算。因此: