gpt4 book ai didi

C ,关于指针(或指向指针的指针?)、** 和 malloc

转载 作者:行者123 更新时间:2023-11-30 19:51:33 24 4
gpt4 key购买 nike

正如标题中所述,我有一个关于使用 * 两次的问题,就像在以下代码的 main 函数中一样。它确实可以运行,但我不明白为什么在这里使用 ** 。我想要的是一个 SPPoints 数组,大小为 n,其中 parr 是基地址。为什么在这种情况下**是对的而*是错的?谢谢。

SPPoint代码:

struct sp_point_t
{
double* data;
int dim;
int index;
};

SPPoint* spPointCreate(double* data, int dim, int index)
{
if (data == NULL || dim <= 0 || index < 0)
{
return NULL;
}
SPPoint* point = malloc(sizeof(*point));
if (point == NULL)
{
return NULL;
}
point->data = (double*)malloc(dim * sizeof(*data));
for (int i = 0; i < dim; i++)
{
point->data[i] = data[i];
}
point->dim = dim;
point->index = index;
return point;
}

这是主要功能:

int main()
{
int n, d, k;
scanf("%d %d %d", &n, &d, &k);
double* darr = malloc(d * sizeof(double));
if (darr == NULL)
{
return 0;
}
SPPoint** parr = malloc(n * sizeof(SPPoint*));
if (parr == NULL)
{
return 0;
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < d; j++)
{
scanf(" %lf", &darr[j]);
}
parr[i] = spPointCreate(darr, d, i);
}
}

最佳答案

当使用动态分配的数组时,通常通过具有指向数组第一个元素的指针来“处理”它,并且还具有一些了解长度的方法,例如显式存储长度,或具有结束标记。

因此,对于代码中动态分配的 SPPoint * 数组,指向其中第一个数组的指针的类型为 SPPoint * *

您现有的代码创建一个 SPPoint * 数组,即指针数组。这些指针中的每一个都指向 SPPoint 的一个动态分配实例,即每个条目都有单独的分配。

这是可行的,但您表明您需要一个 SPPoint 数组,在这种情况下,指向第一个元素的指针的类型为 SPPoint *

为了拥有这样的数组,它是单一的内存分配。因此,您需要重新设计您的 spPointCreate 函数。目前,它只为一个 SPPoint 分配内存并初始化。相反,您希望将分配与初始化分开,因为您只需要一次分配,但需要多次初始化。您的程序逻辑将如下所示:

  • 分配一 block 足够大的内存块供 n SPPoints
  • 初始化分配空间内的每个SPPoint

如果您尝试过此操作但遇到困难,请发布一个新问题,显示您的代码并解释您遇到困难的位置。

关于C ,关于指针(或指向指针的指针?)、** 和 malloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41371879/

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