在C++中将浮点数组的参数填充为 float*

Populating argument of float array as float* in C++

本文关键字:填充 参数 float 数组 C++      更新时间:2023-10-16

>我有这样的函数:

bool funcFloats(float* output) {
output = new float[100];
populateArray((float *) &(*firstArray)[0], output); //First array is an std::vector<uint8_t>
for(int i=0; i<100; i++) {
std::cout<<output[i]<<std::endl;
}
}
template <typename A, typename B> void populateArray(A *in, B *out)
{
using namespace std;
for (unsigned y = 0; y < 100; y++)
{
out[y] = in[y];
}
}

我用这个来称呼它:

float array[100];
obj.funcFloats(array);
for(int i=0; i<100; i++) {
std::cout<<array[i]<<std::endl;
}

在 funcFloats 末尾打印的内容是正确的,但在调用函数后打印的内容则不正确。这是为什么呢?

这是因为你在函数内部分配了output,使得传递到funcFloat数组完全无用。当funcFloat退出时,它保持未初始化状态,从而导致输出不正确。

funcFloat中删除要output的分配以解决此问题:

bool funcFloats(float* output) {
output = new float[100]; // <<== Remove this line
populateArray((float *) &(*firstArray)[0], output);
for(int i=0; i<100; i++) {
std::cout<<output[i]<<std::endl;
}
}

虽然这将解决眼前的问题,但代码将保持不C++惯用。您应该尽可能远离"原始"C 样式数组,改用向量。这修复了多个问题,例如您看到的问题,但也修复了数组边界不匹配的可能性(将 1000 个项目写入 100 个项目的数组(、可能的内存泄漏以及无法动态增长数组。

bool funcFloats(float* output) {
output = new float[100];

正如在另一个答案中已经指出的,您在上述output作业中遇到了问题。使用new[]动态分配float数组,将指向第一个数组元素的指针分配给output变量,这样做,作为参数传递的原始output数组在赋值后丢失。

另请注意,C++没有垃圾回收器,因此当您使用new[]显式分配内存时,您应该具有使用delete[]释放该内存的代码。

更好的方法(这将使您的代码更简单(是使用std::vector<float>而不是原始的 C 样式数组。这个标准的向量容器将自动释放自己的内存(所以你不必注意代码显式地这样做(。而且,如果你想向函数传递一个输入/输出数组参数,你可以传递一个(非常量(引用给std::vector,例如:

bool funcFloats(std::vector<float> & output) {
...