C++如何将string首尾字符地址赋值给unsigned char const指针
报错核心原因
C++标准中char、signed char、unsigned char是三种互不兼容的独立类型,不同类型的指针之间不存在隐式转换规则,哪怕目标指针带const限定,也无法直接把char*类型的地址隐式赋值给const unsigned char*类型的指针,这就是编译抛出非法转换错误的根本原因。
另外原始代码还存在两个额外的编译问题:
- 没有引入
<iostream>头文件,cout的定义位于该头文件中 - 输出语句里的指针名大小写错误,定义的变量名为大写开头的
Ptr,输出时写的是小写ptr,编译器无法识别该变量
修复实现方案
使用C标准提供的reinterpret_cast做指针类型的显式重解释转换即可完成类型匹配,这是C中做不同类型指针转换的标准合规写法,不建议使用C风格的强制类型转换。
注意:直接用
cout输出unsigned char*类型指针会触发标准库的特殊重载,被识别为C风格字符串进行输出,会从指针指向的位置开始连续读取内存直到遇到空终止符,容易触发内存越界的未定义行为。如果需要输出指针的地址值,要先转成const void*类型;如果需要输出指针指向的非打印字符,要转成整数类型避免输出乱码。
修复后的可正常编译运行的完整代码如下:
#include <string> #include <iostream> using namespace std; int main() { string Str {"Stackoverflow"}; unsigned char const *Ptr = reinterpret_cast<unsigned char const*>(&Str.front()); unsigned char const *BufLim = reinterpret_cast<unsigned char const*>(&Str.back()); // 输出指针存储的地址值 cout << "首字符地址:" << static_cast<const void*>(Ptr) << '\n'; cout << "尾字符地址:" << static_cast<const void*>(BufLim) << '\n'; // 输出指针指向的字符 cout << "首字符内容:" << *Ptr << '\n'; cout << "尾字符内容:" << *BufLim << '\n'; return 0; }
内容的提问来源于stack exchange,提问作者Meganathan
相关产品推荐
相关产品推荐

