[问题] 指标转型问题

楼主: cityhigh (city)   2015-01-17 14:53:20
开发平台(Platform): (Ex: VC++, GCC, Linux, ...)
GCC
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
问题(Question):
在ST_TEST str1为local变量时, 将指标转型成int,再将int转回成指标后,
会发生Segmentation fault。不转型的话就不会有问题。
test()和test2()说明转型和不转型的差型。
但如果将ST_TEST str1; 定为成global变量,test2()的转型也还可以使用。
int main()
{
ST_TEST str1;
test(&str1);
test2((int)(&str1));
}
void test(ST_TEST *const str_point)
{
ST_TEST str2;
memcpy((ST_TEST *)&str2, (ST_TEST *)str_point, sizeof(ST_TEST));
}
void test2(int str_int)
{
ST_TEST str3;
memcpy((ST_TEST *)&str3, (ST_TEST *)str_int, sizeof(ST_TEST));
}
喂入的资料(Input):
预期的正确结果(Expected Output):
错误结果(Wrong Output):
程式码(Code):(请善用置底文网页, 记得排版)
http://pastebin.com/cMiJiCsf
补充说明(Supplement):
作者: PkmX (阿猫)   2015-01-17 15:46:00
pointer转成int在转回来本来就是不合法的事情...你如果要存可以指向任何type的指标请用void*举例来说在x86_64底下sizeof(int) == 4 ; sizeof(int*) == 8至于为什么str1宣告成global就可以 应该是因为他摆在bss刚好被map在32-bit可以表示的范围内 如果是摆在stack上面通常是摆在high address 所以一转换就烂了
楼主: cityhigh (city)   2015-01-17 16:33:00
还是不太懂,一转换就烂掉指的是什么?对test()和test2()来看,传入的address印出来也是一样的
作者: wenyonba (射后不理很XX啊!!!!)   2015-01-17 16:50:00
他应该是说,你把8bit转成4bit,那是要拿低位还是高位?如果Compiler拿的状况不如你的预期,不就挂了我这样说会不会有点病...
作者: azureblaze (AzureBlaze)   2015-01-17 17:42:00
保证能转的只有intptr_t和uintptr_t
作者: PkmX (阿猫)   2015-01-17 20:54:00
https://gist.github.com/PkmX/a0073d4d7904137d9638可以看到stack上面的位置转成int再转回void*值根本就错了而global变量因为位置数字够小 所以转换"刚好"没问题不过重点就是别依赖这种"刚好"的行为 挑正确的type去装才对而且其实把void*转成int编译的时候就会产生warning了=.=
作者: bibo9901 (function(){})()   2015-01-17 21:02:00
http://tinyurl.com/3d487sk板友的大作, 里面讲得很清楚
作者: Killercat (杀人猫™)   2015-01-18 00:10:00
别想些有的没的 乖乖用void*中转吧....c就算了 c++其实根本没必要做这种没意义的乱转就是
作者: LPH66 (-6.2598534e+18f)   2015-01-18 02:39:00
真想转成整数的话转成 intptr_t 就什么事都没有
作者: carylorrk (carylorrk)   2015-01-18 13:00:00
又不是做 compiler 研究,标准说有问题就不要用,不要去研究为什么结果刚好正确或是为什么回事这样。这是等你熟悉了语言和平台想自己研究再说
作者: TobyH4cker (Toby (我要当好人))   2015-01-18 13:34:00
原因PkmX说了,int 还是4 Bytes应该建议一下版主现在发问还要提供平台为x86还是x86_64
楼主: cityhigh (city)   2015-01-19 09:16:00
感谢各位大大

Links booklink

Contact Us: admin [ a t ] ucptt.com