C 指针数组以加倍
C array of pointers to double
我在 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;
也许您需要调整其他条目的大小 - 我把这个练习留给你。
此外,您不必担心内存泄漏。
相关文章:
- 添加到数组指针
- C++语法差异:二维和一维数组(指针算术)
- 数组指针表示法C++(移动数组时)
- 复制后删除原始数组指针将前 3 个字节设置为 0
- C++访问指向结构的指针中的类数组指针
- C++编译时使用 constexpr 字符数组指针分配静态数组?
- std::flush可以用于将对象指针转换为其封闭数组指针吗
- 创建<int>对整数数组指针的矢量引用 (C++)
- 将 2D 数组指针传递给 C++ 中的函数
- 创建指针是否超过非数组指针的末尾,而不是从 C++17 中的一元运算符和未定义的行为派生?
- 队列数组指针 (C++)
- C++数组指针上的删除操作
- 对于循环不循环和检测字符数组 [指针和字符数组]
- 如何初始化数组指针对象
- 如何正确传递 2D 数组指针作为参数
- 从数组指针中获取怪异的数字
- 初始化std :: unique_ptr作为原始数组指针的初始化
- 将结构数组指针从C#传递到C
- STD :: Sort将数组指针设置为NULL
- C++数组指针错误无法将“int*”转换为“int**”