了解矩阵 c 的分配

Understand Allocation of matrix c

我有以下功能:

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]...

这种表述是否正确?

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

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

在上面提到的行中,您首先创建了 n 个类似于一维数组的浮点指针。 在循环中,所有这些指针都分配给另一个 n 大小的 'array',你得到一个 nxn 矩阵。

你在这里做了什么:

float **m = (float**)calloc(n, sizeof(float*));
  1. 您已经创建了一个 float 类型的指针**。
  2. 然后你给这个指针分配一个由

    组成的连续内存块的起始地址

    (n * sizeof(float*))

字节。所有这些字节的值都为零。您现在可以从此内存块寻址 n 个元素,每个元素包含

sizeof(float*)

字节,即:

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

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

  1. 接下来要做的是:将这些元素(m[0]、m[1] 等)中的每一个赋值给 each 其中 不同的 内存位置有新的不同内存块。这些内存块中的每一个都包含

    (n * sizeof(float*))

字节,你可以寻址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]