簡體   English   中英

為什么我不能聲明unsigned char * test =“Some text”

[英]Why I can't declare unsigned char* test = “Some text”

這在visual studio 2010中不起作用,它給我以下錯誤

void main (void)
{
     unsigned char* test = "ATGST"; 

}

編輯1:我的問題是為什么這適用於嵌入式系統,但不適用於PC?

在此輸入圖像描述

但當我把它改為:

 char* test = "ATGST";  

有用。

我使用C為嵌入式系統編寫代碼的主要內容是,我使用visual studio來測試某些功能,因此我不必在Micro-controller上實時測試它。

我需要一個解釋,因為微控制器接受第一個代碼。

編輯以符合刪除C ++標記並安撫嵌入式標記。

首先,問題在於,您正在嘗試將char[]文字傳遞給unsigned char* 你真的不能等同於是char unsignedsigned ,它是在這方面有點特殊。 此外,字符串文字具有唯一存儲空間,不應修改。 如果你正在處理字符,你需要使用char[]可以衰減的標准 char* 你可以強行施放它,但我不喜歡推薦這樣的東西。 正如其中一條評論所指出的那樣,這樣做是安全的。 實際上,它實際上是一種非常罕見的東西,實際上是一個安全的明智之舉。

但是,對於在reinterpret_casting上提供足夠資格的嚴格答案的空間太小,這基本上是告訴編譯器你知道你在做什么。 這可能非常危險,只有在您對手頭的問題非常肯定時才應該這樣做。 char通常只是通用的,甚至沒有簽名或未簽名。 由於unsigned char的范圍大於char,並且通常char使用signed char的正子集來描述字符(或任何其他類型的數據),如果您的數據不在擴展的正范圍內,那么'好好去。 但是,要安全地符合環境和代碼。

關於入口點功能 - 符合編輯

由於已確定您在嵌入式系統上工作,這意味着您的程序很可能不需要返回任何內容,因此它可以保持為void main() (也可能是它需要由指定的非常不同的返回在給定的嵌入式系統中,OP最了解他的系統所要求的要求。 在很多情況下,你可以保持無效的原因是因為沒有環境/操作系統可以安撫,沒有人可以與之通信。 但嵌入式系統也可以非常專業化,最好通過詳細研究給定平台來實現,以滿足強加的要求(如果有的話)。

首先,你需要一個const 其次, char != unsigned char ,也是(唯一的)!= signed char

字符串文字的類型為const char[N] - 適當的大小為N ,因此只能轉換為const char* 請注意,該語言有一個特殊的規則,允許您隱式刪除const 但它仍然是UB來修改字符串文字 ,這使得這是一個非常糟糕的主意。

在這方面,微控制器的C實現是不一致的。 最好簡單地使用const char* ,這是正確的,而不是試圖破解VS接受錯誤的代碼。

我相信這是將字符串分配給unsigned char *的情況。

好吧,當你分配一個字符串值時,它會分配與字符相關的ASCII值,所以你應該使用char *來代替unsigned char *。

如果你想分配字符串,字符以外的值,那么你的實現是正確的。

希望能幫助到你。

如果要對文本使用字符類型,請使用非限定字符。

如果要將字符類型用作數字,請使用unsigned char。 unsigned char,它給你至少0到255的范圍。

有關更多信息: 什么是unsigned char?

我的問題是為什么這適用於嵌入式系統,但不適用於PC?

很可能是因為你不小心用C ++編譯的PC代碼比C更嚴格的類型檢查。在C中,無論你使用unsigned char還是plain char都沒關系,代碼編譯就好了。

但是,正如其他答案中所建議的那樣,您的代碼存在一些應該修復的問題。 如果代碼需要在嵌入式和Windows上運行,則應將其重寫為:

#ifdef _WIN32
int main (void)
#else
void main (void)
#endif
{
  const unsigned char* test = "ATGST"; 

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM