今天在研究C++通过ADO连接SQl获得返回值时,发现了奇怪的问题,如下代码:
const char* s = "It's test"; //给定一个初始char*
cout << strlen(s) << endl; //输出长度,显示为9
_variant_t t = _variant_t(s); //把char*转换为_variant_t
char* c = (char*)(_bstr_t)t; //再把_variant_t转换为char*
//下面就是奇怪的地方了
cout << (char*)(_bstr_t)t << endl; //这个转换可以显示正确的字符串
cout << c << endl; //这个转换出来就是乱码
cout << strlen(c) << endl; //输出长度,长度变成了14
按照我的理解,转换后直接输出,和转换后赋给一个变量再输出,应该是一样的吧?
我要利用这个返回的结果,如果不赋给一个变量,后续也没有办法用这个结果。
所以在这个过程中到底发生了什么?求指点,应该怎么来严谨地获取这个结果啊?
(char*)(b_str)t;这句话将产生一个临时变量。这个临时变量,将随着语句的结束而结束。所以c指向的是一个临时变量。
而你用cout<<方式,其实是operator<<( ....,const char* rh) ,那个临时变量会传递给rh ,生命周期延长,直到<<结束,所以能够显示正确
而第一个把临时变量给了char* ,执行下一句时候,指向的对象失效了,因此是一个随机字符串
https://blog.csdn.net/xiaobai1593/article/details/7492424
_variant_t转换为char *:
错误方法:
_variant_t vValue;
char * value=(LPSTR)(LPCSTR)_bstr_t(vValue)
value指向一堆乱码...
原因:不能用char *直接指向(LPSTR)(LPCSTR)_bstr_t( _variant_t ),因为这样转换之后实际上是一个string,而非一个char *
正确方法:
进行转换时,只能用strcpy(),将LPSTR指向的字符复制到char * 所指向的内存中;
如下例:
_variant_t vValue;
char cValue[16]={0};
strcpy(cValue, (LPCSTR)_bstr_t(vValue));
单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。