2013-02-27 124 views
1

我正在通過一個C代碼,並想知道我是否正確地理解了代碼。類型鑄造指針在C

有一種結構,BF_salt在頭文件中定義,如下所示:

typedef 
{ 
BF_WORD salt[4]; 
.. 
.. 
} BF_SALT; 

在主C代碼,有對函數的調用:

function func1() 
{ 
static BF_SALT salt; 
func2(salt.salt,x,y); 
.... 
} 

func2(BF_WORD * dst,x,y) 
{ 
unsigned char * dptr= (unsigned char*)dst; 
int c1,c2; 

// c1 and c2 are initialized here. 

// in a loop, an operation similar to the below is performed. 

*dptr++ = (c1 << 2) | ((c2 & 0x30) >> 4); 
} 

我的理解上面的代碼是:

在func1中,salt定義爲BF_SALT結構的數據類型。

我們調用func2,傳遞結構的鹽場。

鹽字段是4個元素的陣列,每個數據類型BF_WORD(32位字或4個字節)中FUNC2

DST

的是陣列的指向的元素的名稱鍵入BF_WORD。

它正在對指針dst執行一個類型轉換。

當前,dst指向數據類型BF_WORD。 它是類型鑄造,以便它指向一個字符(1字節數據)。

現在它正在對整數c1和c2執行移位操作,並將輸出寫入由dptr指向的內存地址。因此,它覆蓋了最初由dst指向的數據(salt數組中的字節)。

c1和c2的數據類型爲int,它需要4個字節的空間。

用什麼方法將dptr覆蓋數組的內容?因爲每次我們都做* dptr ++,所以我們將指針dptr前進1個字節,因爲它指向一個字符。

但是,我們正在爲它分配一個大於1個字節的值。數據如何寫入內存?

謝謝。

回答

0

你上面的代碼的理解,類同我的,也讓我的芯片在我自己的一些想法

unsigned char * dptr= (unsigned char*)dst; 

這裏DST它的類型是BF_WORD(4個字節),則向下鑄造到一個字符類型(1字節) 另外值得注意的是,雖然指針的類型是char,並且可以一次導航 一個字節,但它確實保存了4字節連續內存位置的地址,因此在技術上它如此必須巧妙地導航這些4字節,一次一個字節。

dptr以什麼方式覆蓋數組的內容?

dptr現在包含4個數字的起始地址,4個字節的數組salt。 因此它當前訪問salt [0]。 這裏salt [0]的大小是4個字節,而dptr是1個​​字節的指針,所以它需要四個(dptr ++) 增量來覆蓋數組salt [0]中的一個元素。現在

其他問題

我們分配給它的大小大於1個字節的值。數據如何寫入內存?

*dptr++ = (c1 << 2) | ((c2 & 0x30) >> 4); 

這裏既有c1和c2是int類型的,所以後按位運算的結果是int類型的。 因此,4字節結果被寫入由dptr指向的salt [0]; 在dptr的下一個增量中,指針將指向前4個字節結果的2個字節,因此前一個結果的最後三個字節將由下一個按位結果溢出。

+0

「*因此,4字節結果寫入由dptr指向的salt [0] ... *」,但只有最低字節被分配給'dptr'指向的內容,因爲它是'unsigned char *'!並且:哪個「* ...下一個按位結果。*」?我看不到任何迴路。 – alk 2013-02-27 18:11:23

+0

@alk是的,我想到了,最低字節分配,如果其隱式typecasted,因此較高的3個字節被截斷, 但我猜只隱含類型轉換,如果左手分配是一個數據類型變量,而不是一個指針。 糾正我,如果我錯了 – 2013-02-27 18:17:22

+0

在左邊有**取消引用**指針。請看* Leushenko *的答案,因爲他非常善良地查找標準。 – alk 2013-02-27 18:19:24

1

這裏

*dptr++ = (c1 << 2) | ((c2 & 0x30) >> 4); 

執行隱式轉換到unsigned char,如dptrunsigned char *類型,因此*dptr被視爲unsigned char

+0

謝謝。是的,增量操作是在指針上執行的,因爲有一個循環,雖然我沒有提到。我已編輯帖子以顯示有一個循環。 – 2013-02-27 18:31:59

+0

@NeonFlash:我明白了,所以更新了我的答案。 – alk 2013-02-28 05:53:56

2

只有結果的最低字節將被寫入內存。由於指針指向一個char,所以int將被截斷,並且在轉換爲左值的類型時,較高的字節將會丟失;與將結果簡單分配給char變量相同的規則。有關詳細信息,請參閱標準章節6.3.2.1和6.5.16.1。