gpt4 book ai didi

c - 了解矩阵 c 的分配

转载 作者:太空宇宙 更新时间:2023-11-04 01:56:01 24 4
gpt4 key购买 nike

我有以下功能:

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*));
  1. 您已经创建了一个 float 类型的指针**。
  2. 然后您将这个指针分配给由

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

    (n * sizeof(float*))

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

sizeof(float*)

字节,即:

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

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

  1. 接下来要做的是:获取这些元素中的每一个(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]

关于c - 了解矩阵 c 的分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34239061/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com