我有以下功能:
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]的...
这种表述是否正确?
答案 0 :(得分:2)
你在这做了什么:
float **m = (float**)calloc(n, sizeof(float*));
然后,为此指针指定由
组成的顺序内存块的初始地址(n * sizeof(float *))
字节。所有这些字节的值都为零。您现在可以从此内存块中解析 n 元素,每个元素都保存
sizeof(float*)
字节,即:
m [0],m [1],m [2],...,m [n - 1]
其中m [0]将返回内存块中第一个元素的实际值,即内存地址。
接下来要做的是:你将这些元素中的每一个(m [0],m [1]等)分配给每个新的不同内存块在不同的内存位置。这些内存块中的每一个都包含
(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]
答案 1 :(得分:1)
该行
float **m = (float**)calloc(n, sizeof(float*));
分配float *类型的n个指针。 在下一个循环中,所有n float *都被赋值给另一个n float *。
在上面提到的行中,首先创建n个浮点指针,它们就像一维数组。 在循环中,所有这些指针都被分配给另一个n大小的数组&#39;你得到一个nxn矩阵。