C 指针数组以加倍

C array of pointers to double

本文关键字:数组 指针      更新时间:2023-10-16

我在 c++ 代码中遇到了内存问题,当然我错了,但我没有得到这个问题。我已经声明了一个由三个指针组成的数组来加倍和分配内存。

double *myDoubles[3];
for(int i=0;i<3;i++) {
myDoubles[i]= (double *) malloc(1000*sizeof(double));
}
myDoubles[2][999]=10.55;

怎么了?

编辑

正如@EdHeal评论和@PhilippKiener我根本不应该使用 malloc。但是在25年之前很难忘记malloc。 毕竟,我的问题是另一个地方的另一个错误,实际上我写的:)超出了限制。我的错!

每次分配 1000 个字节,而不是 1000 个双精度。 你应该做的是:

malloc(1000 * sizeof(double));

完整的代码应如下所示:

double* myDoubles[3];
for(int i = 0; i < 3; i++) {
myDoubles[i] = (double*) malloc(1000 * sizeof(double));
}
myDoubles[2][999] = 10.55;

首先要做的是:不要在返回malloc投递指针。void*(在您的情况下)double*是隐式的(也是预期的),但显式强制转换通常被认为是不好的做法。

现在谈谈你的问题;malloc分配给定数量的字节,并返回指向这些字节的指针。您分配了 1000 个字节,但您想要的是分配足够的字节来执行 1000double秒。出错的原因是double大于单个字节 - 它是 8 个字节。您可以使用sizeof(type)获取类型的大小;因此,要为 1000double秒分配足够的内存,您必须将循环内的行更改为:

myDoubles[i] = malloc(1000 * sizeof(double));

要了解系统上类型的大小,您可以

printf("Size of double: %d", sizeof(double));

在您的代码中。

编辑:

现在,由于您正在使用C++,因此根本不应该使用malloc。C++让生活更轻松,给你new

分配行应为

myDoubles[i] = new double[1000];

新的好处是它不需要提供的尺寸......你给它一个类型和数量;它会计算您需要的字节数。但要注意,而不是free你应该使用

delete[] myDoubles[i];

当您使用C++时,请使用std::vector- 看这里

所以代码变成了

std::vector<std::vector<double>> myDoubles(3);
myDoubles[2].resize(1000);
myDoubles[2][999] = 10.55;

也许您需要调整其他条目的大小 - 我把这个练习留给你。

此外,您不必担心内存泄漏。