2010-07-14 81 views
1

背景:我正在接收一个数组作为char *作为套接字会话的一部分。现在我们必须将Tokens(HTTP标头)与它匹配。这里的代码是我们创建了一个UBYTE *并在用UBYTE进行类型转换之后从char数组中获取值。后来相同的UBYTE指针我们传递给其他函数,该函数在将它转换为char *后接受char *。char *和UBYTE *之间的类型转换*(无符号字符*)

这里的问题是在发布版本中而不是在调试版本中(使用-g和不同的优化)。不仅如此,在调试模式下添加少量打印可以隐藏问题。

所以我的问题在这里,UByte指针(它本质上是一个无符号字符)和字符指针有什么区别。将UByte更改为char可以解决所有模式中的问题,但我对此没有任何解释?有什么想法吗 ?

回答

3

char *unsigned char *之间铸造没有任何问题。如果您的意外行为取决于优化级别,您的代码中肯定存在一个错误,但它可能与抛弃演员中的签名无关。

除此之外,UBYTE是一个非常荒谬的typedef,因为存在一个标准的C类型,uint8_t,它在stdint.h中是相同的和定义的。

+0

@R。,少许校正,unit8_t'的'存在是由POSIX执行小的宽度的整数,而不是由C. – 2010-07-14 08:47:33

+0

Ç保证它的存在,如果一个8位整数类型存在。如果不存在8位类型,那么定义自己的“UBYTE”也是不可能的。由于这个问题是关于处理HTTP头的,所以目标几乎可以肯定平台能够处理网络数据单元(字节)。 “CHAR_BIT!= 8”真的是一个不值一提的病理学。除了永远不会成为便携式程序目标的DSP和老式机器之外,它永远不会发生。 – 2010-07-14 09:41:16

+0

@R,他们将它命名为UBYTE并不意味着它具有8的宽度。它仅显示他们期望它是什么。 – 2010-07-14 11:13:31

0

也许你可以在第一个地方解释,为什么你尽管你首先使用了unsigned char? 什么不工作是什么意思?

void*char*unsigned char*有不同的语义,你应该使用它们根据是:

  • void*点与除非你将其转换为一些真正类型,你不能做任何事情的非特异性数据
  • char*不幸的是,它有两种不同的含义,既可以是文本字符串,也可以是非特定数据,但可以在低字节级别寻址(修补)
  • signed charunsigned char是要在其上执行算术
+0

为什么我选择使用char *是通过使用相同的数据类型。 函数1调用函数2(传递char *参数)。 功能2将其复制到本地Ubyte *。 函数2调用函数3(它接受char *)。 所以在我的意见函数2作为从函数1 - 函数3通过并不必要地改变它为UBYTE添加类型转换或引用/解引用指针的开销。 PS:我没有看到我的代码有任何逻辑问题,因为当前代码在释放(O2)和调试(O3,g)+在有问题的功能中额外打印时都起作用。 – Aryan 2010-07-14 09:36:56

+0

感谢Jen的回复和见解。 只是为了让自己清楚,它不是我满意的。我已经与我一起编写了旧的书面代码,随着时间的推移,人们的舒适度已经改变了。使用生产代码,我的意思是Parse函数没有逻辑问题,因为它正在运行很长时间。 我只是想弄清楚Char *和UBYTE *之间的合理区别。 也许我错误地坚持它,应该看看代码的其他方面。 :-( – Aryan 2010-07-14 11:50:00

+0

@Ayan,我想在这样的设置中很难找到某些东西,但是如果你要清理那些代码,那么从更合理的类型方案开始是一个好主意,如果看到很多讨厌的bug通过整理代码而消失,无论如何,祝你好运。 – 2010-07-14 12:03:23