了解矩阵 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*));
- 您已经创建了一个 float 类型的指针**。
然后你给这个指针分配一个由
组成的连续内存块的起始地址
(n * sizeof(float*))
字节。所有这些字节的值都为零。您现在可以从此内存块寻址 n 个元素,每个元素包含
sizeof(float*)
字节,即:
m[0], m[1], m[2], ..., m[n - 1]
其中 m[0] 将 return 您是内存块第一个元素的实际值,即内存地址。
接下来要做的是:将这些元素(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]
我有以下功能:
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*));
- 您已经创建了一个 float 类型的指针**。
然后你给这个指针分配一个由
组成的连续内存块的起始地址(n * sizeof(float*))
字节。所有这些字节的值都为零。您现在可以从此内存块寻址 n 个元素,每个元素包含
sizeof(float*)
字节,即:
m[0], m[1], m[2], ..., m[n - 1]
其中 m[0] 将 return 您是内存块第一个元素的实际值,即内存地址。
接下来要做的是:将这些元素(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]