2017-02-17 118 views
-2

我的開發環境包括了ARM OMAP Sitata的G ++交叉編譯器。我發現簡單的指針算術的一個不尋常的細微差別,加入一個unsigned int到一個unsigned int *時,如下:將unsigned int類型到無符號整型*

unsigned int* dst_base_addr; 
unsigned int* dst_addr; 
unsigned int dst_offset; 

只需嘗試添加的(無符號整數)到(無符號整數*)

dst_addr = dst_base_addr + dst_offset; 

以上不被解釋爲一個可能天真地認爲,但實際上產生以下等效的結果

dst_addr = (unsigned int*)((unsigned int)dst_base_addr + (dst_offset << 2)); 

補救的方法當然是做正確的類型轉換爲如下

dst_addr = (unsigned int*)((unsigned int)dst_base_addr + dst_offset); 

問題:爲什麼在這種情況下甚至需要進行正確的類型轉換?

+0

爲了避免錯誤。 – 2017-02-17 14:42:35

+0

'dst_addr = dst_base_addr + dst_offset;'不爲dst_addr分配內存不好。 –

+0

'DST_ADDR =(unsigned int的*)((unsigned int類型)dst_base_addr + DST_OFFSET);'但是這是錯誤的,指針運算不一樣, – SingerOfTheFall

回答

7

以上不被解釋爲一個可能天真地認爲,但實際上產生在C(大概C++)以下等效的結果

指針運算的單位的大小事指着完成。如果添加n至一個int*生成將添加儘可能多的字節代碼,因爲它需要爲n個int小號即大概4 * N如果int爲32位(在大多數理智架構4個字節)。

這是標準的C行爲。

相關問題