將0強轉為指標的一種用法

2021-09-24 19:01:14 字數 833 閱讀 5567

問題

#include#includetypedef struct aa a;

int main(void)

測試

int main(void)

結果84

segmentation fault

分析首先我們先看這個結構體型別強制轉換是什麼意思呢?

結構體就是定義了一段記憶體空間,指定這段空間的記憶體布局,比如

struct c ;
我們將其定義為4bytes+1bytes

null就是乙個型別為void *,值為0的指標,或者說這個指標指向的位址為0。

那麼經過(aa *),null被認為指向一段位址空間,它的分布是4bytes+4bytes+3bytes。

而(aa *)null->o,因為o是陣列名(位址常量),所以此時得到是乙個位址,這個位址應該是null+o在結構體中的偏移量(8)即0+8

而&((aa *)null->b)同理,只不過這裡b是乙個變數名,相當於對null+b在結構體偏移量(4)解引用,而後再次取位址,即0+4

而(aa *)null->a 和b一樣,只是因為沒有取位址,所以是解引用非法位址,所以出現了段錯誤。

驗證既然我們猜想是這樣的,那麼將null換成其他的常量指標也可以,並且計算結果相同。

int main(void)
同理 第乙個 是1+8應該是9,第二個應該是2+4,第三個則是3+0

讓我們執行一下,看看結果

9

63

和我們的**一致

將中文姓名轉為拼音英文名的一種實現

需要將中文名轉為英文名,這裡需要考慮到姓氏以及名字多音字選擇,這裡記錄一下我實現的一種思路。以下 均使用js來進行說明。首先需要判斷名字長度以及名字規範 中文名格式驗證 verifyname function str return true 當名字長度超過兩個子的時候需要判斷複姓的情況,如名字為歐陽...

alarm的一種用法。

alarm函式可以用於防止讀阻塞。但如果系統呼叫是自動重啟動的,當從sigalrm訊號處理程式返回時,read並不被中斷。在這種情形下,設定時間限制不起作用。一 源 cat n 10 10.c 1 include apue.h 23 static void sig alarm int sig no ...

Oracle update的一種用法

用於大資料量的更新,效率比較高,括號內的select語句為虛擬表,要求where欄位必須是主鍵或唯一索引 b.customer id和a.customer id 記錄一下,以後用得上。例子 update select a.city name,b.city name as new name from ...