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

How to cast int pointer to float pointer

本文关键字:指针 转换 int      更新时间:2023-10-16

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

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

对于这些强制转换,我看到以下消息:

"可移植性","无效指针转换","整数* 和浮点数* 之间的转换,它们具有不兼容的二进制数据表示形式。">

执行上面显示的铸造类型的正确方法是什么?按照上面显示的方式投射指针的潜在后果是什么?

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

使用重新解释转换。

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

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

显示的演员阵容本身已经很好地定义了;做这样的演员表是没有用的。

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

std::vector<float>(500);

严格来说,由于严格的混叠冲突,代码的行为是未定义的。

实际上,如果intfloat的大小相同(它们在许多桌面平台上,尽管有一些推动力将int移动到 64 位(,则代码将运行而不会出错。虽然要重申一下,从标准C++的角度来看,这一点绝对没有保证。

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

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

按 new 使用旧样式的 C 数组也是合法的(这是C++标准(:

float* f_buffer = new float[500];

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

delete [] f_buffer;

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