2

char *将类型转换为 C 中的类型是否有任何危险signed char *,其中 char 数组被解释为字节数组。

我在 gcc 中读到过,char类型可以是无符号的,也可以是有符号的,具体取决于系统。在“最坏”的情况下,这char *将是 a unsigned char *,但由于数组只是被解释为一系列位,因此类型是否从无符号变为有符号并不重要。

(顺便说一句,我检查了其他帖子,但我只看到了问题 re: cast unsigned charto signed char,我想知道是否有任何独特的东西只是 plain char。提前谢谢。)

4

4 回答 4

4

转换本身不应该有任何问题,特别是如果您只是将数组解释为字节。在这种情况下,尽管我建议您考虑使用 C99 类型uint8_tint8_t更好地传达您的意图,如果它们可供您使用的话。

于 2013-06-13T18:26:02.350 回答
2

没有危险,明确允许char在所有三种 char 类型之间重新解释指针,也可以将任何对象指针重新解释为 char 指针(因此将任何对象视为字节数组)。

于 2013-06-13T18:25:12.030 回答
1

分配后有一些比较的边缘情况,但是对于存储和交给不同的功能,没有任何危险......

同样在您的实现中,默认情况下 char 可能已签名或未签名...

比较和签名问题的示例:

在 MacOS X 上使用 c99 中的 clang

char * dog = malloc(1);
dog[0]= 0xff;
unsigned char * mansBestFriend = dog;

if (mansBestFriend[0] > dog[0]) {
    puts("boy that is strange");
}

输出:奇怪的男孩

由于 C 中的比较规则有时令人困惑,因此比较的发生方式可能看起来很奇怪。

还有很多其他时候可能会发生这种情况,而我永远记不起的是其中一个值大于另一个值并且一个有符号而另一个没有的情况......最好强制转换如果您要对不同类型进行比较,请明确表示。

于 2013-06-13T18:28:21.873 回答
1

不,这样做没有危险,因为您只想将它​​用于其字节值。

于 2013-06-13T18:29:10.080 回答