将char *转换为int *的结果是什么

时间:2016-09-27 09:22:04

标签: c++

代码如下:

int main(void) {
    char* str = "12345678";
    int* in = (int*)str;
    printf("%d\n%d\n", in[0], in[1]);
    return 0;
}

结果如何?为什么呢?

3 个答案:

答案 0 :(得分:1)

  

结果如何?

实施定义。

  

为什么?

因为标准是这样说的。

§5.2.10.7

  

可以将对象指针显式转换为不同类型的对象指针。当一个prvalue v   对象指针类型被转换为对象指针类型“指向cv T的指针”,结果是static_cast(static_cast(v))。将“指向T1的指针”的prvalue转换为“指向的指针”   T2“(其中T1和T2是对象类型,T2的对齐要求不比更严格   那些T1)并返回其原始类型产生原始指针值。

顺便说一句,这在c ++:char* str = "12345678";中是非法的,因为字符串文字是const。要正确,它应该是:const char* str = "12345678";

答案 1 :(得分:1)

答案是(对于我的系统)

875770417
943142453

原因如下: str指向“12345678”。在我的系统中,int是4个字节。所以*指向“1234”,*指向+ 1指向“5678”。 在内存中,char以二进制形式存储。

现在让我们看一下[0]。在[0]中将评估“1234”。内存表示将是这个(二进制):

00110001 00110010 00110011 00110100

(这些是1,2,3,4的ascii值,即-49,50,51,52)

现在,因为已将char分配给int,所以编译器现在将大约32位加载为一个字。取决于 BIG ENDIAN或LITTLE ENDIAN 评估将会发生。我的系统是LITTLE ENDIAN。 所以我的评价就这样发生了 -

 52*(2^24) + 51*(2^16) + 50*(2^8) + 49 = 8775770417

[1]中的类似解释。希望这可以解决问题。

答案 2 :(得分:0)

结果是未定义的行为n4296(C ++ 14的最终草案)定义为

  

本国际标准没有要求的行为

任何都可能发生。段错误,硬盘擦除等。一个相当合理的结果是ASCII字符“1234”被视为四字节小端整数的字节,并打印出结果数字(类似于“5678”) - 但不要依赖这个。