我有以下代码:
int some_array[256] = { ... };
int do_stuff(const char* str)
{
int index = *str;
return some_array[index];
}
显然上面的代码在某些平台上会导致错误,因为* str实际上可能是负面的。
所以我想到了两种可能的解决方案:
在赋值(unsigned int index = (unsigned char)*str;
)上投射值。
改为传递const unsigned char*
。
编辑:这个问题的其余部分没有得到处理,所以我把它移到了一个新的线程。
答案 0 :(得分:5)
ClassLoader
的签名确实取决于平台,但您所知道的是char
的值与char
的{{1}}一样多,并且转换是单射的。因此,您绝对可以转换值以将查找索引与每个字符相关联:
unsigned char
您当然应该确保unsigned char idx = *str;
return arr[idx];
至少有arr
个元素。 (这可能会导致UCHAR_MAX + 1
时出现欢闹的边缘情况,幸运的是很少见。)
答案 1 :(得分:4)
允许字符签名或取消签名,具体取决于平台。无符号范围的假设是导致您的错误的原因。
您的do_stuff
代码不会将const char*
视为字符串表示形式。它将它作为一系列字节大小的索引用于查找表。因此,在unsigned char
内对字符串的字符强制do_stuff
类型没有任何问题(即使用您的解决方案#1)。这会将char
重新解释为本地化为do_stuff
函数实现的索引。
当然,这假设您的代码的其他部分确实将str
视为C字符串。