簡體   English   中英

C ++在char指針中存儲char數組

[英]C++ store char array in int pointer

在這一行中是否有任何類型的轉換(隱式,顯式):

int *p= "hello there"; 

此外,從C / C ++的角度來看,這種陳述的正確性是什么?

注意:它在AVR-GCC上編譯,並與其他編譯器失敗。

“在這一行中是否有任何類型的投射(隱式,顯式):”

 int *p= "hello there"; 

不,沒有任何鑄造。

但是在C ++中,你可以使用reinterpret_cast<int*>const_cast<char*> ,如下所示:

int *p= reinterpret_cast<int*>(const_cast<char*>("hello there")); 

查看工作演示。

“此外,您如何從(C,C ++)的角度思考這種陳述的正確性。”

好吧,這完全留給用戶這樣的聲明。 當然不建議這樣做(因為你沒有指定1行為),如果你不是100%肯定你正在做什么,那就很危險。

但至少兩種語言都支持這樣做。

C的一個較短的變體是:

int *p= (int*)"hello there";

“注意:它在AVR-GCC上編譯,並與其他編譯器失敗。”

好吧,我不知道你用於AVR交叉工具鏈的版本,但任何中途版本的GCC都應該給出這樣的聲明錯誤

prog.cpp:3: error: cannot convert 'const char*' to 'int*' in initialization

請看演示

我正在使用相當舊版本的GCC來構建該演示:g ++ 4.3.2。 如果我得到正確的通知,最新的是5.x,我很確定可以用它為AVR 構建交叉工具鏈


1 這與未定義的行為略有不同。 僅取決於您的硬件與這些指針地址以及對齊設置的關系。

回答你的問題(忽略'為什么這么做'評論 - 這是正確的)

你做

int *p=(int*)"hello there";

此代碼在C和C ++中是非法的。 我們可能會猜到AVR-GCC假裝你寫的:

int *p = (int *)"hello there";

您也許可以嘗試通過以下方式確認:

char *q = "hello there";
int *p = q;

並查看pq保持相同的地址。 (盡管這兩種方式都不會完全確定)。

最好找出如何在一種模式下調用編譯器,它將報告錯誤或警告非法代碼。 通常對於gcc, -Wall -pedantic ,通常你也會指定一個標准版本,例如-std=c99-std=gnu99


假設代碼被視為int *p = (int *)"hello there"; 此代碼可能會導致未定義或意外的行為,因為char數組可能無法正確對齊int

此外,如果由於違反嚴格別名規則而讀取或寫入p ,則會導致未定義的行為,該規則表明讀取或寫入為int僅允許聲明為int變量或malloc'd空間(如果正在讀取)已經寫了一個int

暫無
暫無

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

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