[英]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;
並查看p
和q
保持相同的地址。 (盡管這兩種方式都不會完全確定)。
最好找出如何在一種模式下調用編譯器,它將報告錯誤或警告非法代碼。 通常對於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.