debugging Malloc调用分配已在使用的地址

hrirmatl  于 2023-04-06  发布在  其他
关注(0)|答案(1)|浏览(94)

简介

我遇到了一个奇怪的问题,我写了下面的代码,要求用户一个矩阵,程序要求的大小,然后在矩阵中的元素。
然后,我再次迭代矩阵,计算每行的maxmin,以及主对角线上元素的和。
我写这个程序以后翻译到汇编,这就是为什么我使用指针为我的矩阵,以保持程序最接近,因为它将在汇编

#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])或maxmin数组,问题就解决了,但这不是我想要的解决方案。
另外,如果我给矩阵分配一些额外的空间,问题就消失了。同样,一个不需要的解决方案。

假设

我认为,除了我搞砸了一些事情之外,对malloc(max = malloc(rows))的第二次调用正在分配数组,覆盖了前一次malloc调用,即在前一行中分配矩阵的调用。

注意事项

感谢大家的帮助,联系我的额外信息有关的问题

ljo96ir5

ljo96ir51#

解决方法在理解底层问题方面是正确的,它是关于空间的。
多少字节?如果一个int占用一个字节的内存,那么答案是rows * cols(这就是你现在所在的位置)。但事实并非如此,一个int实际上占用两个字节或四个字节(通常是四个,但这取决于编译器)。使用sizeof来确定int的大小,并将其纳入计算。
因此:

matrix = malloc(sizeof(int) * rows * cols);  
    max = malloc(sizeof(int) * rows);  
    min = malloc(sizeof(int) * rows);

相关问题