最近在看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,一邊開發者自己的產品,這不得不說是一種極大的諷刺。至於,第...