将字符数组转换为无符号字符指针

6
有没有办法将char[]转换为unsigned char*
char buf[50] = "this is a test"; 
unsigned char* conbuf = // what should I add here
2个回答

8
尽管这可能在技术上不是100%合法的,但这会起作用reinterpret_cast<unsigned char*>(buf)
之所以这不是100%技术上合法的,是因为5.2.10 expr.reinterpret.cast第7款。

可以将对象的指针显式转换为不同类型对象的指针。原始类型产生原始指针值,这种指针转换的结果是未指定的。

我认为这意味着*reinterpret_cast<unsigned char*>(buf) = 'a'是未指定的,但*reinterpret_cast<char*>(reinterpret_cast<unsigned char*>(buf)) = 'a'是可以的。

如果我记得标准正确的话,有一个例外规定说使用指向[[un]signed] char的指针访问任何类型对象的内存是合法的。我认为这使得您的代码行为定义良好。 - HolyBlackCat
@HolyBlackCat 我不记得有这样的措辞,如果你能提供一个参考,我会更新答案。 - Motti
很遗憾,我无法找到标准参考。但是我在SO上发现了一些声称有一个例外可以使用char *来规避严格别名规则(这意味着“使用指向[[un]signed] char的指针访问任何类型对象的内存是合法的”)。请参见此链接:https://dev59.com/43VD5IYBdhLWcg3wE3Ro#99010 您可以使用char*进行别名处理<...>规则允许char*(包括signed char和unsigned char)的例外情况。始终假定char*与其他类型别名。但是反过来不起作用:没有假设您的结构体与字符缓冲区别名。 - HolyBlackCat

6
只是投掷它吗?
unsigned char *conbuf = (unsigned char *)buf;

7
在 C++ 中,“只需强制转换”通常需要免责声明 :) - tenfour
1
呵呵!免责声明:此答案适用于您在问题中展示的文本。请勿尝试对带有有符号8位数字的数组使用它。 - Dave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接