使用malloc创建多维数组时的奇怪行为

时间:2017-03-24 09:05:56

标签: c arrays multidimensional-array malloc

让我们从代码开始:

#include <stdio.h>
#include <stdlib.h>
int main (void) {

    int** matrix;
    int n = 5;
    int m = 5;
    matrix = (int**)malloc(n*sizeof(int*));
    for (int i = 0; i < n; i++) {
        matrix[i] = (int*)malloc(m*sizeof(int*));
    } 

    //This works:
    matrix[4][90] = 50;
    printf("%d", matrix[4][90]);

    //This produces an error:
        //matrix[5][90] = 50;
        //printf("%d", matrix[5][90]);

    return 0;

}

我一直在使用这种方法为二维阵列动态分配内存(而且我也见过很多人也使用它)并且效果很好。然而,最近我注意到它似乎分配了比预期更多的内存,我无法理解为什么。

在上面的示例中,我尝试创建一个5x5阵列。它创建恰好5行(n),如果您尝试访问除这些行以外的任何行,则会出现错误。按预期工作。大!然而,当我只想创建它时,似乎它创建了大量的列(m)。为什么这样,我该如何解决?

同样的事情似乎也适用于calloc。

谢谢!

1 个答案:

答案 0 :(得分:2)

更改行:

matrix[i] = (int*)malloc(m*sizeof(int*));

到:

matrix[i] = (int*)malloc(m*sizeof(int));

由于matrix[i]的类型为int *,因此您为其分配的内存将包含int

  

但是,当我只想创建5列时,它似乎正在创建大量的列(m)

不是。您通过尝试访问内存范围之外的元素来调用undefined behaviour,因此您显示的第一个示例会意外地工作。您的代码每行只会创建5列。