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

问题描述 投票:0回答:1

介绍

我遇到了一个奇怪的问题,我正在编写以下代码请求用户一个矩阵,程序要求大小,然后是矩阵中的元素。

稍后,我再次迭代矩阵以计算每行中的

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 调用的数组,即在前一行中分配矩阵的调用。

注意

感谢大家的帮助,联系我以获取有关该问题的更多信息

pointers debugging matrix malloc overflow
1个回答
0
投票

就理解潜在问题而言,解决方法是在正确的轨道上,它是关于空间的。您需要 malloc 足够的字节来存储

int
s.

多少字节?如果单个

int
占用一个字节的内存,那么答案将是
rows * cols
(这就是你现在所在的位置)。但事实并非如此,一个
int
实际上占用两个字节或四个字节(通常是四个,但这取决于编译器)。使用
sizeof
确定
int
的大小并将其计入计算中。

因此:

    matrix = malloc(sizeof(int) * rows * cols);  
    max = malloc(sizeof(int) * rows);  
    min = malloc(sizeof(int) * rows);
© www.soinside.com 2019 - 2024. All rights reserved.