【发布时间】:2013-12-25 21:11:39
【问题描述】:
我很难完全理解发生了什么。
这就是我阅读底部代码的方式。
将 A 定义为指向一个指针地址的指针,该指针指向 双地址。
在堆上分配 4 个内存块,每个内存块可以容纳一个 地址为双。返回分配的第一个块的地址 到 A.
在堆上分配 6 个内存块,每个内存块可以容纳一个 double 数据类型并返回 4 个中每一个的第一个块的地址 较早分配的块。
变量 A 仍然包含四个块中第一个块的地址 假设 A[0] 改变了指向地址的值的指针 由 A 而不是 A 本身。
现在这是连接在底部的图表的来源。假设我想访问存储在红色块中的数据。我该怎么做?
下面的代码可以工作吗?
double data = *(*(A + 3) + 2);
我的逻辑是 A 是一个指针,递增 3 应该将地址增加大小为 (double *) 的字节数。取消引用地址(A + 3),我将获得第一个块的地址(假设它没有重新分配)。通过将结果地址增加 2 并取消引用该地址,我应该获得红色块处的值。
所以如果我理解正确的话,1 + M 指针被存储在内存中。为什么?如果目标是存储 MxN 数据,为什么我需要 1 + M 指针来这样做?如果我想定义不同大小的行,额外的指针似乎会有所帮助,但目标是定义一个矩形数据数组。
const int M = 4;
const int N = 6;
double **A;
A = malloc(M*sizeof(double *));
for (i = 0; i < N; i++) {
A[i]= malloc(N*sizeof(double));
}
图表:
旁注: 我是电气工程专业的学生,在某种程度上不熟悉 C 语言和正式的编程实践。我知道我对这么简单的代码行很迂腐,但我想确保我正确理解指针和内存分配。乍一看,它们很难理解。这是我的教授给我的矩阵乘法代码的一部分,我想将指针传递给一个函数并让它访问和修改内存中的正确值。个人希望看到此代码的二维数组,但我认为这是有充分理由的。
【问题讨论】:
标签: c pointers memory memory-management