我不知道爲什麼會發生這種情況,我想我正在做所有事情。也許有人可以幫助我指出正確的方向。不兼容指針類型的作業
unsigned short* x;
int textLeft[16];
x = shm->textLeft;
這些在程序中間隔出來,所以我不想複製一堆代碼,但如果需要更多,請讓我知道。
沒有給我不兼容的指針類型,不應該這樣工作嗎?
我不知道爲什麼會發生這種情況,我想我正在做所有事情。也許有人可以幫助我指出正確的方向。不兼容指針類型的作業
unsigned short* x;
int textLeft[16];
x = shm->textLeft;
這些在程序中間隔出來,所以我不想複製一堆代碼,但如果需要更多,請讓我知道。
沒有給我不兼容的指針類型,不應該這樣工作嗎?
不,這不應該工作,因爲你分配一個int*
值的unsigned short*
變量,它會導致每個的C strict aliasing rule未定義行爲。
,使這項工作在不改變類型的方法是
x = (unsigned short *)(shm->textLeft);
和-fno-strict-aliasing
編譯打開走樣規則了。但是真的,我強烈建議你將類型改爲兼容,否則你會將自己綁定到單個編譯器對C標準的擴展。
+1在C中,類型錯誤並不存在,只是你沒有足夠的東西。 – 2013-12-19 11:17:50
@HermanTorjussen:類型錯誤確實存在;如果沒有'-fno-strict-aliasing'(一個GCC特定的選項),編譯器可以自由地以任何方式打破這個代碼。 –
這就是我對幽默的嘗試..我的觀點是C對類型不是很嚴格。 – 2013-12-19 11:20:37
`unsigned short`
不是
`int`
所以限定
x
作爲int *
或textLeft[16]
如unsigned short
和事情都很好。
你說得對,我以爲我曾經這樣做過,但是它處理了錯誤。但我記得現在我從別的東西得到另一個錯誤。在做int之前,我得到一個「無效的參數」,但它沒有。 – user2318083
在你的情況下,x
是一個無符號短指針,textLeft
是一個有符號整數。您正嘗試將有符號整數地址分配給無符號短指針。
什麼是shm?它是如何定義的?如果它是'int textLeft [16]',那麼這是正常的,'unsigned short *'與'signed int []'不一樣' – Eregrith
struct Shared * shm; – user2318083