有人可以幫我解決以下錯誤。在我嘗試通過buf
之前是否應該投下len
?無符號字符數組與int轉換爲無符號字符
int len=2;
unsigned char tmp[len + 1];
unsigned char * buf = &tmp;
的錯誤是:
error: cannot convert 'unsigned char (*)[(((unsigned int)((int)len)) + 1)]' to 'unsigned char*' in assignment
有人可以幫我解決以下錯誤。在我嘗試通過buf
之前是否應該投下len
?無符號字符數組與int轉換爲無符號字符
int len=2;
unsigned char tmp[len + 1];
unsigned char * buf = &tmp;
的錯誤是:
error: cannot convert 'unsigned char (*)[(((unsigned int)((int)len)) + 1)]' to 'unsigned char*' in assignment
如果你只想要一個指針數組,使用
unsigned char * buf = tmp;
順便說一句,你的方式宣告tmp
使它成爲variable-length array( VLA)。從技術上來說,儘管許多編譯器支持VLA作爲擴展,但它仍然是these are not allowed in C++。
也爲了讓它編譯,len必須聲明爲const。 – davidnr
問題不是len
。問題在於你試圖獲取數組的地址,而不是數組的第一個元素的地址;類型根本不匹配。
相反:
此外,數組名方便(FSVO 「方便」)衰減到&tmp[0]
,所以你可以簡單的寫:
unsigned char* buf = tmp;
此外,您目前沒有使用陣列的維數—的常量值確保len
被製作爲const
並且使用恆定值進行初始化。在C++ 11中,最好是constexpr
到真的是確保你不會意外嘗試使用GCC VLA。
噢,C++ 11中斷了什麼情況,以至於你必須添加'constexpr'而不是僅僅使用一個具有ICE可見初始化器的'const' int? –
@SteveJessop:我不知道任何,但肯定'constexpr'是它的性質更可取?如果你總是確保你有一個可見的初始化器,那麼很好,但要求OP記住這樣做似乎有點觸手可及。沒有違法,OP。 –
啊,我專注於「真正確保」而不是「更好」。我以爲你的意思是在C++ 11中'const int'確實不能確保這一點。 AFAIK你是對的,'constexpr'是用C++ 11表達它的一種更好的方式。 –
數組內部表示形式作爲指針。這是你的情況類型的tmp是無符號字符*和類型的buf是無符號字符* .So類型錯過匹配您嘗試將char **分配給char *。 – rajesh6115
@Rajesh:**數組不是指針**'tmp'的類型是'unsigned char [3]'。沒有其他的。這裏沒有'unsigned char **',當然也沒有'char **'。 –
@Lightness在軌道中進行比賽:抱歉忘記添加指向固定內存位置的常量指針(指針值無法更改)。但我解釋它只適用於類型錯過匹配沒有別的。 – rajesh6115