intptr t 其實不是指標型別

2021-07-27 11:29:12 字數 2684 閱讀 4489

最近在看nginx原始碼,看到有乙個型別intptr_t,沒有見過,google了一下,有人說是指標型別,但是看nginx原始碼中對該型別變數的使用,好像不是指標型別。

[cpp]view plain

copy

static ngx_int_t  

667 ngx_get_options(int argc, char *const *argv)  

668   

680   

681         while (*p)   

680   

681         while (*p) {  

682   

683             switch (*p++) {  

684   

685             case

'?':  

686             case

'h':  

687                 ngx_show_version = 1;  

688                 ngx_show_help = 1;  

689                 break;  

其中ngx_int_t的定義如下:

[cpp]view plain

copy

78 typedef

intptr_t        ngx_int_t;  

[cpp]view plain

copy

78 typedef

intptr_t        ngx_int_t;  

於是在linux的標頭檔案中查詢這個型別的定義,在/usr/include/stdint.h這個標頭檔案中找到了這個型別的定義(不知道怎麼在這裡插入,所以使用文字):

[cpp]view plain

copy

117 /* types for `void *' pointers.  */

118 #if __wordsize == 64  

119 # ifndef __intptr_t_defined  

120 typedef

long

intintptr_t;  

121 #  define __intptr_t_defined  

122 # endif  

123 typedef unsigned long

intuintptr_t;  

124 #else

125 # ifndef __intptr_t_defined  

126 typedef

intintptr_t;  

127 #  define __intptr_t_defined  

128 # endif  

129 typedef unsigned int

uintptr_t;  

130 #endif  

[cpp]view plain

copy

117 /* types for `void *' pointers.  */

118 #if __wordsize == 64  

119 # ifndef __intptr_t_defined  

120 typedef

long

intintptr_t;  

121 #  define __intptr_t_defined  

122 # endif  

123 typedef unsigned long

intuintptr_t;  

124 #else

125 # ifndef __intptr_t_defined  

126 typedef

intintptr_t;  

127 #  define __intptr_t_defined  

128 # endif  

129 typedef unsigned int

uintptr_t;  

130 #endif  

很明顯intptr_t不是指標型別,但是上邊的一句注釋(/* types for `void *' pointers. */)讓人很疑惑。既然不是指標型別,但是為什麼說型別是為了「void *」指標?

又查了一下在《深入分析linux核心原始碼》中找到了答案,原文描述如下

儘管在混合不同資料型別時你必須小心, 有時有很好的理由這樣做. 一種情況是因為記憶體訪問, 與核心相關時是特殊的. 概念上, 儘管位址是指標, 記憶體管理常常使用乙個無符號的整數型別更好地完成; 核心對待物理記憶體如同乙個大陣列, 並且記憶體位址只是乙個陣列索引. 進一步地, 乙個指標容易解引用; 當直接處理記憶體訪問時, 你幾乎從不想以這種方式解引用. 使用乙個整數型別避免了這種解引用, 因此避免了 bug. 因此, 核心中通常的記憶體位址常常是 unsigned long, 利用了指標和長整型一直是相同大小的這個事實, 至少在 linux 目前支援的所有平台上.

因為其所值的原因,c99 標準定義了 intptr_t 和 uintptr_t 型別給乙個可以持有乙個指標值的整型變數. 但是, 這些型別幾乎沒在 2.6 核心中使用

其實,TCP不是那麼NB

這問題,最後查出來時,只能說是我自己的問題!一直以來,我以為使用tcp的socket時,send函式會準確的傳送你給他的buff,不管包多大,只要不超過他的系統緩衝buff,那麼tcp就會幫你自動拆分傳送資料報,接收端會自動拼裝。我曾經一直相信,tcp是不會出錯的!但是現在,我要說,一切還得靠自己!...

string型別其實就是乙個指標

listlisturl new list 類鍊錶 ajaxclass ajaxclass new ajaxclass ajaxclass.name 美男1號 ajaxclass.url listurl.add ajaxclass ajaxclass.name 美男2號 ajaxclass.url l...

騰訊其實不是「狗日的」

針對第一點,沒有什麼好說。盜版侵權是中國計算機的一大特色,無論是南京的珠江路還是北京的中廣村,全國各地的大街小巷,你都能找到盜版碟的身影。中國人對智財權的保護幾乎為零。看到這些,是一件很可悲的事情。中國的很大一部分程式設計師一邊使用盜版vc,一邊開發者自己的產品,這不得不說是一種極大的諷刺。至於,第...