intptr_t 類型

轉載地址:http://blog.csdn.net/justlinux2010/article/details/7490420

最近在看nginx源碼,看到有一個類型intptr_t,沒有見過,google了一下,有人說是指針類型,但是看nginx源碼中對該類型變量的使用,好像不是指針類型。

[cpp] view plain copy

static ngx_int_t  
 667 ngx_get_options(int argc, char *const *argv)  
 668 {  
 669     u_char     *p;  
 670     ngx_int_t   i;  
 671   
 672     for (i = 1; i < argc; i++) {  
 673   
 674         p = (u_char *) argv[i];  
 675   
 676         if (*p++ != '-') {  
 677             ngx_log_stderr(0, "invalid option: \"%s\"", argv[i]);  
 678             return NGX_ERROR;  
 679         }  
 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;  

於是在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 int        intptr_t;  
121 #  define __intptr_t_defined  
122 # endif  
123 typedef unsigned long int   uintptr_t;  
124 #else  
125 # ifndef __intptr_t_defined  
126 typedef int         intptr_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 內核中使用

發佈了34 篇原創文章 · 獲贊 7 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章