诡异的函数返回指针被改写的问题
之前程序在32位ubuntu主机跑的好好的,换了64位的redhat,重编译运行,出现了莫名其妙的段错误。经定位是指针地址从函数返回后被改变了,求高手帮忙看看。
代码简化如下:
- C/C++ code
List * fnc(){ List *events = NULL; events = gwlist_create(); // 封装了malloc /** A **/ return events; }fncB(){ List *events = NULL; events = fnc(); /** B **/ events->sth; //段错误}用gdb调试:
(gdb) p events //在 A 处打印指针
$2 = (List *) 0x7fffe80087e0
(gdb) p events //在 B 处打印指针
$3 = (List *) 0xffffffffe80087e0
(gdb) x/4b 0x7fffe80087e0
0x7fffe80087e0: 112 -119 0 -24
(gdb) x/4b 0xffffffffe80087e0
0xffffffffe80087e0: Cannot access memory at address 0xffffffffe80087e0
被这个问题折磨几天了,头疼啊。
更诡异的是 把fncB单独拎出来写个单元测试,又一切正常!! 在原本的程序处理流程里才有这个问题。。。
[解决办法]
fnc在调用之前没有声明?
试试先声明后调用。
- C/C++ code
List * fnc();fncB(){ List *events = NULL; events = fnc(); /** B **/ events->sth; //段错误}
[解决办法]
0x7fffe80087e0被截断为32后变成0xe80087e0,
然后因为返回值为int类型,带符号转换为指针类型后就是0xffffffffe80087e0
楼主可以在64位的机器上试试这个语句,
printf("%p\n", (void *)(int)0x7fffe80087e0L);
输出应该类似
0xffffffffe80087e0