问题引入
我在使用某些供应商提供的库的时候发现,他们的指针在linux下面强转为了long,而long不仅会表示这种被转换过的指针与他们提供的接口交互,也会继续在某些地方充当数字本身,而我在尝试使用long提供的指针指向的数据的时候遇到了问题。
看一部分测试代码
#include <iostream>
using namespace std;
int main()
{
//int a = 5;
//int *p = &a;
//cout<<p<<endl;
//cout<<(long)p<<endl;
//long x = (long)p;
long x = 89;
cout<<(int*)x<<endl;
int *pn = (int*)x;
cout<<pn<<endl;
unsigned char *p = (unsigned char *)pn; // 可以正常运行
cout<<p<<endl;//不能正常打印
return 0;
}
测试平台为在线C++,
以上代码的输出为
0x59
0x59
run: line 1: 3 Segmentation fault (core dumped) LD_LIBRARY_PATH=/usr/local/gcc-9.2.0/lib64 ./a.out
Exited with error status 139
在这里面,long的值可以转换为int*但是无论是一次转换成unsigned char*还是曲线转换,在调用的时候都会出错,哪怕只是打印地址值。目前尚不清楚原因。









网友评论