我读过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系统下的输出结果。对于可移植性问题我还是个新手,所以请问一下,如果我的代码中类似这样的语句,会引起任何可移植性问题吗?即使不是在这段代码中,当代码变得越来越复杂(包括动态分配等),长时间运行时是否会出现一些意外情况(未定义行为)?感谢您的帮助。
sizeof(int)
不等于4*sizeof(unsigned char)
。 - ChronoTrigger4
,你应该使用sizeof(int)
。 - Barmari < ptr + sizeof arr
。或者直接使用i < 1[&arr]
。 - Ben Voigt