指向變量的指針
回答
您將addr
轉換爲指向int的指針,將其解引用並將其放入read_value
。
如果addr
真的是int
,我認爲這是未定義的行爲。
(int *) (addr)
將數值addr
轉換爲int *
指針。除非特別注意,否則此操作是不安全的,因爲addr
的任意值可能違反int
的對齊要求。一般來說,如果addr
的值不是int
大小的倍數,則可能導致讀取錯位,最終可能會導致產生SIGBUS
信號。
星號最終獲取位於該地址的int
值(稱爲解除引用)並將其保存到read_value
。如果地址沒有被充分對齊,就會發生錯位讀取。如果地址碰巧受到限制或保護,解引用也可能導致分段錯誤。
我真的宣佈addr
是uintptr_t
型的,而不是int
,因爲這給投地int *
之間更安全。 uintptr_t
應該對應於指針的大小和表示,而int
類型在語義上與指針無關。
只是在這裏添加,這種做法被稱爲「類型雙關」。如前所述,這可能是危險的。如果不能確定對齊方式,可以使用'memcpy()'來讀取「int」值。 – FatalError 2012-02-01 13:35:10
採取下面的例子:
int read_value = 0;
int address = 0x1234;
read_value = *(int *) address;
這相當於:
read_value = *(int *) 0x1234;
此在read_value
對象在地址0x1234
並存儲讀取int
。首先將int
值0x1234
轉換爲指向int
的指針,然後解引用指針以訪問指向的值int
。
請注意,轉換(int *) 0x1234
是實現定義的。
(C99,6.3.2.3p5)「的整數可以被轉換爲任何指針類型。除先前指定,其結果是實現定義的,可能無法正確對齊,可能沒有指向的一個實體引用的類型,並可能是陷阱表示。「
而且,如果指針是無效指針或者它沒有正確的對齊方式,則指針的取消引用是未定義的行爲。任何使用無效指針都是未定義的行爲。無效指針是一個不爲空的指針,但不指向適當的對象或函數。
- 1. ROM變量指針指向RAM變量?
- 2. 變量向量的指針向量
- 3. 指向JavaScript中變量的指針
- 4. 指向矢量的指針不指向
- 5. C指針,指向全局變量:不同的指針
- 6. 如何指向指針變量
- 7. 常量指針VS指向不變
- 8. 指向矢量的指針
- 9. 通過指針指向結構指針來更改變量
- 10. 指針的向量
- 11. 是否有可能有一個指針指向第一個指針所指向的變量的指針?
- 12. 刪除指針向量中的指針指向的對象
- 13. C++ - 指向向量的指針數組?
- 14. 指向字符串的指針向量
- 15. 指針變量
- 16. 指向指針的指針和指向數組的指針
- 17. 指向常量常量的空指針
- 18. 指針或全局變量的指針?
- 19. 在創建時將變量指針指向變量
- 20. 迭代指針向量指針
- 21. C++強制指針指向指向基指向指針的指針
- 22. C++向量指針
- 23. 指針指向指針
- 24. 將指針指向指向指向int的指針的指針指向指向double的指針的指針是正確的嗎?
- 25. 何時指向成員變量的指針變爲有效?
- 26. C++類型鑄造指向常量變量的指針
- 27. 爲什麼將「指針指向非常量」轉換爲「指向常量指針的指針」
- 28. Objective-C的雙指針。改變指針指向的位置。
- 29. C++:指針指向的值變化
- 30. 改變這個指針指向的值
只有當強制轉換導致無法表示的值時,纔會出現未定義的行爲。 (見C11 6.3.2.3)。 – Lundin 2012-02-01 15:20:31