昨天碰到了问题,32bit机器正常,但64bit机器crash,把问题简化了下
func_a.h
声明了mystruct * func_a( );
func_a.c定义了
mystruct * func_a( )
{
//mystruct * inner进行内存申请和赋值
//print %p, inner-----address1 0x7ff87804b4a8
return inner;
}
func_b.c调用了func_a函数(但没有包含func_a的声明)
mystruct * pt_mst = func_a(); //打印pt_mst, 发现地址值非address1,0xffffffff7804b4a8,地址值被截断了
尝试改从函数参数使用二级指针返回,是正常的。
在stackoverflow上找到相同问题
http://stackoverflow.com/questions/23144151/64-bit-function-returns-32-bit-pointer
By default all return values are int. So if a prototype is missing for function then compiler treats the return value as 32-bit and
generates code for 32-bit return value. Thats when your upper 4 bytes gets truncated.
在编译log里面看到了 func_a函数的implicit-function-declaration警告,像这类警告常见,但是因为func_a的用法(返回指针)
和64bit机器触发了这个地雷。
良好的编程习惯,老生重谈,warning和编译error同样都需要处理,消除warnning才是良好的习惯。。。