2016-02-26 66 views
0

我有一個函數在需要作爲輸入的整數我的C++應用程序。可悲的是這個整數只是一個usigned字符數組,這不由得我做到這一點的形式提供:這兩個演員之間有什麼區別?

unsigned char c[4] = {'1','2','3','4'}; 

void myFuncThatBadlyNeedsInts(int i) 
     //compares some memory value(which is an int) with anotherone... 

myFuncThatBadlyNeedsInts((int)c); 

這給了我一個錯誤,它告訴我,這是不允許的。 但是,如果我決定要棘手,做到這一點:

myFuncThatBadlyNeedsInts(*((int*)&c)); 

現在程序進入有關,給我總是我想要的結果。我的問題是:爲什麼兩個演員的結果有差異? 難道他們不應該都做同樣的,用之探源我在過程中的兩個三分球不必要的?

幫助或指導的alredy現有的答案,我qustion是非常讚賞。

編輯(因爲我不能評論)需要這個確實無聊的轉換,從一個DWORD至極,其比較特定內存位置(作爲int)一個項目在繼承從FGPA retrived並以數組形式出現。 DWORD最後讀取爲一個十六進制數字。 我會盡力獲得更改,並感謝所有人的快速回復。我真的沒有得到這個程序的部分,我也不明白爲什麼它首先這樣工作。現在我知道有人很幸運

P.S:因爲即時通訊新來的,這是我第一次qustion請讓我知道你可能需要的其他具體或只需編輯我牛逼misshabits了。

+1

雖然我已經回答了你的兩個電話會發生什麼,我不能說你真正應該做的事情,因爲我不知道你真正想做的事。你想將整個數組作爲單個32位整數傳遞嗎?只傳遞數組中的一個元素?請詳細說明您嘗試解決的*實際*問題([關於XY問題的相關閱讀](http://xyproblem.info/))。 –

+0

這是爲什麼在C和C++中存在聯合概念的一個更好的原因 - 它允許你真正地告訴編譯器你在做什麼。現在你欺騙它變成做颼權..... – tofro

+0

@tofro使用工會辦[*類型雙關*](https://en.wikipedia.org/wiki/Type_punning)在C行不行,但不是在C(它明確地在說明書中提及)++其中它違反了[*串混疊規則*](http://stackoverflow.com/questions/98650/what-is-the-strict-aliasing-rule)。 –

回答

0

在你想投的字符數組爲int第一種情況下才達到什麼 - 這是在一個列表顯然毫無意義字符與int相當不同。

在第二種情況下,您首先獲取數組的地址 - &運算符爲您提供指向數組元素的第一個元素的字符指針。 具體的&c類型是unsigned char * - 它是合法的(雖然危險)到指針類型之間投從而從unsigned char *鑄造到int *是合法的。

然後取消引用指針,並得到整數,在這個地方這可能是從第一對夫婦的字符串,其中那些字節字符的衍生一些討厭的(無意義的)數量。

因此,你的第二個解決方案不會從char[]轉換爲int[]這大概是你想要的,而是它給你一個字符數組的第一個字節的整數表示。

1

這樣做myFuncThatBadlyNeedsInts((int)c)編譯第一衰減所述陣列c指針到所述第一元件,即&c[0],那麼你施放此指針int並傳遞給函數。

當你做*((int*)&c)你拿(int (*)[4]類型)數組的地址,並告訴大家,這是一個指向int(這是不正確的)編譯器,然後解引用是(不正確)int*

所以兩個呼叫實際上是不正確。該演員只是使編譯器沉默。


如果你想治療的四個字節數組作爲一個單一的32位的字,有很多方法可以做到這一點,但他們都休息the strict aliasing rule

最簡單的方法是非常接近你現在所擁有的,並與鑄造完成。使用C-鑄造你投的是c衰變爲指針int和取消引用指針:

myFuncThatBadlyNeedsInts(*(int*)c); 

注意,這是不一樣的東西或者您的嘗試。

第二種方法是使用一個聯盟:

union my_union 
{ 
    char bytes[sizeof(int)]; 
    int integer; 
}; 

然後數據bytes成員複製到您的工會,並讀出integer

+1

擴大評論「兩個電話實際上是不正確的」。第二個要求是對編譯器說謊,「如果你對編譯器說謊,它會得到它的報復」 - 亨利斯彭斯。訪問轉換返回的值是未定義的行爲,很容易造成程序崩潰。 –

0

在你的指針從無符號的字符比它轉換爲整數,所以實際上你總是用你的UCHAR,只是(在這種情況下,整個數組c)經過3個字節的第二種情況。因爲sizeof int是4(通常,但並非總是),並且uchar的大小隻有1。所以,除非你喜歡用自己的腿來拍攝,否則不要這樣做。

說實話,我真的不明白,你要在這個例子中

相關問題