小编Alt*_*ris的帖子

对指针指针和动态内存分配感到困惑

我很难完全理解正在发生的事情.

这就是我在底部阅读代码的方式.

  1. 将A定义为指向指向double地址的指针地址的指针.

  2. 在堆上分配4个内存块,每个内存块可以将地址保存为double.返回分配给A的第一个块的地址.

  3. 在堆上分配6个内存块,每个内存块可以保存双数据类型,并为之前分配的4个块中的每个块返回第一个块的地址.

  4. 变量A仍然包含四个指针的第一个块的地址,假设A [0]改变了A指向的地址而不是A本身的值.

现在这是图表的底部链接的地方.让我们说我想访问存储在红色块中的数据.我该怎么办?

以下代码是否有效?

double data = *(*(A + 3) + 2);
Run Code Online (Sandbox Code Playgroud)

我的逻辑是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));
}
Run Code Online (Sandbox Code Playgroud)

图:

在此输入图像描述

旁注:我是电气工程专业的学生,​​在某种程度上不熟悉C和正式的编程实践.我知道我对这么简单的代码行很迂腐,但我想确保我正确理解指针和内存分配.乍一看他们很难理解.这是我教授给我的矩阵乘法代码的一部分,我希望将指针传递给函数并让它访问并修改内存中的正确值.个人希望看到这个代码的二维数组,但我假设有一个很好的理由.

c memory pointers memory-management

7
推荐指数
1
解决办法
528
查看次数

标签 统计

c ×1

memory ×1

memory-management ×1

pointers ×1