理解矩阵c的分配

时间:2015-12-12 11:01:22

标签: c memory-management calloc

我有以下功能:

float **alloc_float_matrix(int n) {
    int i;
    float **m = (float**)calloc(n, sizeof(float*));
    for (i = 0; i < n; i++) {
        m[i] = (float*)calloc(n, sizeof(float));
    }
    return m;
}

我想知道为什么会这样做

float **m = (float**)calloc(n, sizeof(float*));

如何分配内存。 我想看到的是地址的布局。 在这一刻,我认为是: m指向一个数组数组。 之后是每个数组的下一个n元素

  
    

m [1] m [2] m [3] m [4] m [5] ... m [n](row1)n [1] n [2] n [3] n [4] n [5] n [6] n [7] ... n [n](row2)n [1] n [2] n [3] n [4] n [5] n [6] n [7]。 ...... N [n]的...

  

这种表述是否正确?

2 个答案:

答案 0 :(得分:2)

你在这做了什么:

float **m = (float**)calloc(n, sizeof(float*));
  1. 您已经创建了一个float **。
  2. 类型的指针
  3. 然后,为此指针指定由

    组成的顺序内存块的初始地址

    (n * sizeof(float *))

  4. 字节。所有这些字节的值都为零。您现在可以从此内存块中解析 n 元素,每个元素都保存

    sizeof(float*)
    

    字节,即:

    m [0],m [1],m [2],...,m [n - 1]

    其中m [0]将返回内存块中第一个元素的实际值,即内存地址。

    1. 接下来要做的是:你将这些元素中的每一个(m [0],m [1]等)分配给每个新的不同内存块在不同的内存位置。这些内存块中的每一个都包含

      (n * sizeof(float *))

    2. 字节,您可以处理n个元素,其中每个元素由

      组成
      sizeof(float)
      

      字节,即:

      (第0行)m [0] [0],m [0] [1],m [0] [2] ,. 。 。,m [0] [n - 1]

      (第1行)m [1] [0],m [1] [1],m [1] [2] ,. 。 。,m [1] [n - 1]

      。 。

      (行n - 1)m [n - 1] [0],m [n - 1] [1],m [n - 1] [2] ,. 。 。,m [n - 1] [n - 1]

      总的来说,你得到的是: 一个数组m,它包含n个连续的存储器地址,其中每个存储器地址都指向 n 存储器块,所有存储器块都位于不同的地址。每个人都持有

      (n * sizeof(float))
      

      个字节,全部连续。 你不能说m [0] [n - 1]之后的下一个存储位置是m [1] [0],但你可以说m [0] [n之后的下一个存储位置 - 2]是m [0] [n - 1]

答案 1 :(得分:1)

该行

float **m = (float**)calloc(n, sizeof(float*));

分配float *类型的n个指针。 在下一个循环中,所有n float *都被赋值给另一个n float *。

在上面提到的行中,首先创建n个浮点指针,它们就像一维数组。 在循环中,所有这些指针都被分配给另一个n大小的数组&#39;你得到一个nxn矩阵。