【发布时间】:2014-05-01 03:13:27
【问题描述】:
我读到reinterpret_cast<> 如果使用不当会很危险。所以我相信我使用得当;)。如果我有模板类并且需要类型转换,我发现它很好用。但最近我读到reinterpret_cast<> 也是不可移植的。我为这一点感到难过。什么原因?取以下代码,
void Disp(int* val)
{
for (int i=0; i < SZ; ++i)
{
cout << *(val+i) << " ";
}
cout << endl;
}
int main()
{
int arr[SZ];
Disp(arr);
unsigned char* ptr = reinterpret_cast<unsigned char*>(arr);
for (unsigned char* i = ptr; i < (ptr + (SZ * sizeof(int))); i++)
{
*i = 0;
}
Disp(arr);
return 0;
}
现在输出:
1174214872 32767 4196789 0 568392584 58 4196720 0 0 0
0 0 0 0 0 0 0 0 0 0
Machine type: Linux 2.6.32-358.11.1.el6.x86_64 #1 x86_64 x86_64 x86_64 GNU/Linux
975580 -16506540 -13369152 0 -4202936 67876 3 -4202836 4 -4202828
0 0 0 0 0 0 0 0 0 0
Machine type: SunOS DELPHI 5.10 Generic_142900-01 sun4u sparc SUNW,Netra-240
我在 Linux 和 Solaris 中都复制了同一个程序的输出。我是可移植性问题的新手。所以谁能告诉我,如果我在我的代码中使用这样的东西,会导致任何可移植性问题吗?即使不使用此代码,当代码变得复杂(使用动态分配等)并长时间运行时,是否有可能出现意外(未定义的行为)。感谢您的帮助。
【问题讨论】:
-
看到这个答案:stackoverflow.com/a/4748348/1491895 指针类型之间的转换是可以的。
-
我打赌
sizeof(int)不是4*sizeof(unsigned char)在其中一台机器上。 -
您应该使用
sizeof(int),而不是硬编码4。 -
我已经改变了。谢谢。
-
不计算数组的大小,而是使用
i < ptr + sizeof arr。或者直接使用i < 1[&arr]。
标签: c++ casting reinterpret-cast