之前碰到过多次这种现象:
不包含某个函数定义的头文件,编译能通过,但是一运行就出段错误,
包含了这个头文件,编译能通过,运行正常
从编译原理上来说这其实是很奇怪的,但每次碰到了都没有深究。
直到今天再次遇到,且用gdb跟进去看了一下,终于明白问题主要出在64位系统与32位系统兼容上了。
static char cur_datas[1024*4] = {0};
char * sensor_get_datas()
{
snprintf(cur_data,"%d,%d\r\n",11,22);
return cur_datas;
}
在另一个文件中使用sensor_get_datas,但没有包含带有char *sensor_get_datas()声明的头文件就会段错误。
在sensor_get_datas查看cur_datas的地址是8字节的,
在调用函数中查看返回的地址却是4字节的,
包含头文件后地址调用函数中查看返回的地址8字节。
问题很明显了,未包含头文件,编译器自动将返回值截断为4字节。
32位系统中不会存在这个问题。