2016-07-07 136 views
0

真或假: 以下分配有效:指針和類型轉換

#define GIMME *(unsigned int**) 0x3000 
unsigned short d = 42; 
GIMME = &d; 

這是假的,雖然我無法理解爲什麼。我最近將Java轉移到C,所以任何幫助將不勝感激。

+3

如何定義「有效」?如果這些行在函數定義中似乎是正確的。整數'0x3000'將以實現定義的方式轉換爲指針,'unsigned short'和'unsigned int'可能具有相同的對齊要求。 – MikeCAT

+3

你想做什麼? –

+2

這不是你正在尋找的代碼。取而代之的是一本好的C書。 – 2501

回答

3

代碼嘗試2個可疑的東西:

  1. 分配數據一些位置(3000),其不知道是有效的。

    *(unsigned int**) 0x3000 = &d; 
    
  2. 試圖分配不兼容的類型。對齊可能失敗,因爲unsigned short可能比unsigned int更窄。 IOWs,這兩種類型可能有不同的最小對準要求。

一個指向對象類型可被轉換成一個指針到一個不同的對象類型。如果生成的指針未針對引用類型正確對齊,則行爲未定義。 C11§6.3.2.37

// similar simplified example 
    unsigned short d = 42; 
    unsigned int* gimme; 
    gimme = &d; // warning: assignment from incompatible pointer type