读书人

诡异的函数返回指针被改写的有关问题

发布时间: 2012-09-28 00:03:35 作者: rapoo

诡异的函数返回指针被改写的问题
之前程序在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

读书人网 >C语言

热点推荐