2010-07-14 93 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

相關問題