诡异的函数返回指针被改写的问题
之前程序在32位ubuntu主机跑的好好的,换了64位的redhat,重编译运行,出现了莫名其妙的段错误。经定位是指针地址从函数返回后被改变了,求高手帮忙看看。
代码简化如下:
List * fnc(){ List *events = NULL; events = gwlist_create(); // 封装了malloc /** A **/ return events; }fncB(){ List *events = NULL; events = fnc(); /** B **/ events->sth; //段错误}List * fnc();fncB(){ List *events = NULL; events = fnc(); /** B **/ events->sth; //段错误}
[解决办法]
0x7fffe80087e0被截断为32后变成0xe80087e0,
然后因为返回值为int类型,带符号转换为指针类型后就是0xffffffffe80087e0
楼主可以在64位的机器上试试这个语句,
printf("%p\n", (void *)(int)0x7fffe80087e0L);
输出应该类似
0xffffffffe80087e0