日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

空指针赋值分区

發布時間:2024/10/8 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 空指针赋值分区 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • 為什么通過空指針讀寫的時候就會出現異常?
  • 除了NULL表示空指針,是否還有其他的值也是空指針?
  • 如果還有其他的值,你們這些表示空指針的值都是什么?為什么?
  • 首先解答第一個問題,在windows核心編程第四版的windows的內存結構一章中,表13-1有提到NULL指針分配的分區。其范圍是從0x00000000到0x0000FFFF。這段空間是空閑的,對于空閑的空間而言,沒有相應的物理存儲器與之相對應,所以對這段空間來說,任何讀寫操作都是會引起異常的。

    有了上面的解答后,第二個問題就很容易解答了。NULL的定義出現以下幾個地方:

    stdio.h文件中

    #ifndef NULL
    #ifdef? __cplusplus
    #define NULL??? 0
    #else
    #define NULL??? ((void *)0)
    #endif
    #endif

    ios.h文件中

    #ifndef NULL
    #define NULL??? 0
    #endif

    windef.h文件中

    #ifndef NULL
    #ifdef __cplusplus
    #define NULL??? 0
    #else
    #define NULL??? ((void *)0)
    #endif
    #endif

    可見,NULL的值,基本上是用0來表示的,是不是只能用0呢?在windows xp sp2的系統平臺下,如果執行下面代碼也是會發生異常的:

    int * pAddr = (int *)0x0000ffff;

    *pAddr = 1;

    而下面的代碼是不會出問題的:

    int * pAddr = (int *)0x00010000;

    *pAddr = 1;

    為什么呢?在windows xp sp2下發現0x00000000到0x0000FFFF是空閑區間,而0x00010000所處的是進程的私有區間。我想第二個問題應該已經解決了,我想,空指針是程序無論在何時都沒有物理存儲器與之對應的地址。為了保障“無論何時”這個條件,需要人為劃分一個空指針的區域,固有上面NULL指針分區。

    在第二個問題的基礎上,要解答NULL指針的范圍,那就相對來說容易了,對于在32位x86計算機上運行的windows xp sp2來說,就是從0x00000000到0x0000ffff。為什么分配如此大的空間?而在定義NULL的時候,只使用了 0x00000000這么一個值,這不是浪費嗎?我想,這是操作系統地址空間的分配粒度相關的,windows xp sp2的分配粒度是64KB,為了達到對齊,空間地址需要從0x00010000開始分配,故空指針的區間范圍有那么大。

    上面的闡述如有問題,希望各位更正,謝謝。

    轉載于:https://www.cnblogs.com/anzhihun/archive/2008/12/06/1349032.html

    總結

    以上是生活随笔為你收集整理的空指针赋值分区的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。