2013-12-19 54 views
-1

我不知道爲什麼會發生這種情況,我想我正在做所有事情。也許有人可以幫助我指出正確的方向。不兼容指針類型的作業

unsigned short* x; 

    int textLeft[16]; 

    x = shm->textLeft; 

這些在程序中間隔出來,所以我不想複製一堆代碼,但如果需要更多,請讓我知道。

沒有給我不兼容的指針類型,不應該這樣工作嗎?

+2

什麼是shm?它是如何定義的?如果它是'int textLeft [16]',那麼這是正常的,'unsigned short *'與'signed int []'不一樣' – Eregrith

+0

struct Shared * shm; – user2318083

回答

2

不,這不應該工作,因爲你分配一個int*值的unsigned short*變量,它會導致每個的C strict aliasing rule未定義行爲。

,使這項工作在不改變類型的方法是

  1. 轉換指針,x = (unsigned short *)(shm->textLeft);
  2. 與海灣合作委員會的-fno-strict-aliasing編譯打開走樣規則了。

但是真的,我強烈建議你將類型改爲兼容,否則你會將自己綁定到單個編譯器對C標準的擴展。

+0

+1在C中,類型錯誤並不存在,只是你沒有足夠的東西。 – 2013-12-19 11:17:50

+1

@HermanTorjussen:類型錯誤確實存在;如果沒有'-fno-strict-aliasing'(一個GCC特定的選項),編譯器可以自由地以任何方式打破這個代碼。 –

+0

這就是我對幽默的嘗試..我的觀點是C對類型不是很嚴格。 – 2013-12-19 11:20:37

1
`unsigned short` 

不是

`int` 

所以限定

  • x作爲int *
  • textLeft[16]unsigned short

和事情都很好。

+0

你說得對,我以爲我曾經這樣做過,但是它處理了錯誤。但我記得現在我從別的東西得到另一個錯誤。在做int之前,我得到一個「無效的參數」,但它沒有。 – user2318083

1

在你的情況下,x是一個無符號短指針,textLeft是一個有符號整數。您正嘗試將有符號整數地址分配給無符號短指針。