如何将int指针转换为float指针

时间:2020-01-29 16:14:33

标签: c++ c++11 cppcheck

我正在针对包含许多类似于以下内容的强制转换的库运行cppcheck(c ++ 11):

// Allocates various buffers
int*   i_buffer = (int*)   calloc (500, sizeof (int));
float* f_buffer = (float*) i_buffer;

对于这些演员,我看到以下消息:

“可移植性”,“ invalidPointerCast”,“在整数*和浮点*之间进行转换,它们具有不兼容的二进制数据表示形式。”

执行上述类型的转换的正确方法是什么?以上面显示的方式强制转换指针的潜在结果是什么?

3 个答案:

答案 0 :(得分:2)

如何将int指针强制转换为浮点指针

使用重新解释演员表。

但是不要尝试这样做,因为重新解释的指针将无用。

执行上面显示的类型转换的正确方法是什么?

显示的演员表本身已经很好地定义了;进行这种投射只是没有用。

如果需要分配浮点数数组,则可以改用以下内容:

std::vector<float>(500);

答案 1 :(得分:1)

严格来说,由于违反了严格别名,代码的行为是不确定的。

在实践中,如果intfloat的大小相同(尽管有一些推动将int移至64位的操作,但它们在许多桌面平台上),代码将运行没有错误。尽管需要重申,但从标准C ++的角度来看,绝对不能保证这一点。

但是您仍然应该修复它。直接分配float数组是明智的做法:

float* f_buffer = (float*) calloc (500, sizeof (float));

答案 2 :(得分:0)

使用旧的C数组(新的(C ++标准))也是合法的:

float* f_buffer = new float[500];

请注意使该内存的释放适应:

delete [] f_buffer;

应始终避免强制类型转换,以保持干净的代码并允许编译器验证代码的正确性。