代码如下:
int main(void) {
char* str = "12345678";
int* in = (int*)str;
printf("%d\n%d\n", in[0], in[1]);
return 0;
}
结果如何?为什么呢?
答案 0 :(得分:1)
结果如何?
实施定义。
为什么?
因为标准是这样说的。
§5.2.10.7
顺便说一句,这在c ++:可以将对象指针显式转换为不同类型的对象指针。当一个prvalue v 对象指针类型被转换为对象指针类型“指向cv T的指针”,结果是static_cast(static_cast(v))。将“指向T1的指针”的prvalue转换为“指向的指针” T2“(其中T1和T2是对象类型,T2的对齐要求不比更严格 那些T1)并返回其原始类型产生原始指针值。
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”) - 但不要依赖这个。