<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    jasmine214--love

    只有當你的內心總是充滿快樂、美好的愿望和寧靜時,你才能擁有強壯的體魄和明朗、快樂或者寧靜的面容。
    posts - 731, comments - 60, trackbacks - 0, articles - 0

    C-sizeof解析

    Posted on 2010-11-29 17:13 幻海藍夢 閱讀(235) 評論(0)  編輯  收藏 所屬分類: C語言學習
    只要參加軟件研發的筆試(C/C++)幾乎都會涉及到sizeof()的用法,我昨天也遇到了,有的也會,但是真正sizeof()的核心還是 沒有領會,今天上網,無聊中就看到了詳細的sizeof()的闡述,現在分享給大家。
    ------------sizeof----------------
    sizeof 一般形式為:sizeof(object),也可以sizeof var_char,不過大部分programer習慣用sizeof()。
         對象可以是表達式或者數據類型名,當對象是表達式時,括號可省略。sizeof是單目運算符,其運算符的含義是:求出對象在計算機內存中所占用的字節數。 一般來講,不同的機器,運行不同的對象是不一樣的,當目前幾乎所有的機器都是32位,很少16位的,所以一般考試都是基于32位的window和 linux的。
    C語言中數據類型不多。
    1.整數型的:
    short,int,long(我沒有考慮符號問題),一般c語言書上講,int是2個字節的,即16位,范圍是 -32768-32767,long是4個字節,范圍是-2^32---2^32-1。當時在xp上運行sizeof(int)的時候,會output 4.這就是32位的原因。sizeof(long)也是4.
    如下:#include "stdio.h"
    #include "string.h"
    #include "stdlib.h"
    int main()
    {
     short int sa=10;
        int a=10;
        long la=10;
        float f = 20;
        double d=20;
        char ch='c';
        char str[]="ABC";
        char *p=str;
        struct str{
      double d;
      char ch;
      int data;
     }str_wu;
     struct str1{
      char ch;
      double d;
      int data;
     }str_wu1;
        printf("sizeof(short):%d\n",sizeof(sa));
     printf("sizeof(int):%d\n",sizeof(a));
        printf("sizeof(long):%d\n",sizeof(la));
        printf("sizeof(float):%d\n",sizeof(f));
        printf("sizeof(double):%d\n",sizeof(d));
        printf("sizeof(char):%d\n",sizeof(ch));
        printf("sizeof(string):%d\n",sizeof(str));
        printf("sizeof(point address):%d\n",sizeof(p));
        printf("sizeof(Point):%d\n",sizeof(*p));
        printf("sizeof(Struct):%d\n",sizeof(str_wu));
        printf("sizeof(Struct):%d\n",sizeof(str_wu1));
        system("pause");
    }
    650) this.width=650;" onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' alt="" src="http://img1.51cto.com/attachment/200810/200810211224596908046.jpg" border="0">
    因而int,short的sizeof結果是一樣的額。
    2.浮點型數據
    float,double,long double
    上邊的圖,long double 沒有測試(忘了。。。。。)呵呵!
    但是應該是16。
    3。指針
    對于指針,要特別區分,指針指向什么數據,它在內存占的字節數才是它的結果。
    比如:指針指向一個字符串,就是字符串的長度,因為一個字符在內存中占一個字節。若指針指向一個數據結構,則結果應該是結構型數據的內存字節 數。
    4。結構類型
    在上面的程序中,
    struct str{
                              double d;
                             char ch;
                              int data;
     }str_wu;
     struct str1{
                               char ch;
                                double d;
                                 int data;
     }str_wu1;

    兩個不同的結構,但是內部的元素是相同的,都是 double,int,char,只是順序不一樣,就結果不一樣。why?
    這時因為VC存儲數據的時候要對其,具體的情況如下:
    類型
    對齊方式(變量存放的起始地址相對于結構的起始地址的偏移量)
    Char
    偏移量必須為sizeof(char)即1的倍數
    int
    偏移量必須為sizeof(int)即4的倍數
    float
    偏移量必須為sizeof(float)即4的倍數
    double
    偏移量必須為sizeof(double)即8的倍數
    Short
    偏移量必須為sizeof(short)即2的倍數
    比如:str_wu,為上面的結構分配空間的時候,VC根據成員變量出現的順序和對齊方式,先為 第一個成員dda1分配空間,其起始地址跟結構的起始地址相同(剛好偏移量0剛好為sizeof(double)的倍數),該成員變量占用 sizeof(double)=8個字節;接下來為第二個成員dda分配空間,這時下一個可以分配的地址對于結構的起始地址的偏移量為8,是 sizeof(char)的倍數,所以把dda存放在偏移量為8的地方滿足對齊方式,該成員變量占用sizeof(char)=1個字節;接下來為第三個 成員type分配空間,這時下一個可以分配的地址對于結構的起始地址的偏移量為9,不是sizeof(int)=4的倍數,為了滿足對齊方式對偏移量的約 束問題,VC自動填充3個字節(這三個字節沒有放什么東西),這時下一個可以分配的地址對于結構的起始地址的偏移量為12,剛好是 sizeof(int)=4的倍數,所以把type存放在偏移量為12的地方,該成員變量占用sizeof(int)=4個字節;這時整個結構的成員變量 已經都分配了空間,總的占用的空間大小為:8+1+3+4=16,剛好為結構的字節邊界數(即結構中占用最大空間的類型所占用的字節數 sizeof(double)=8)的倍數,所以沒有空缺的字節需要填充。所以整個結構的大小為:sizeof(str_wu)=8+1+3+4=16, 其中有3個字節是VC自動填充的,沒有放任何有意義的東西。
    而str_wu1,同樣的道理:如下:sizeof(char)=1,而1不 是8的倍數,因而增加到8,sizeof(double)=8,現在開始地址是16,16是sizeof(int)的倍數,可以存入。
    因而總的地址 數:sizeof(char)+7+sizeof(double)+sizeof(int)=20,
    而20不是8的倍數(sizeof(double)=8),所以需要在增加4 個地址,即總共24。
    ----------------------
    sizeof具體的,我所知道的就這些了,那位高手還知道什么,或者我寫的有 什么錯,希望指出。謝謝!
    原文; http://lemonmilk.blog.51cto.com/499577/107155
    主站蜘蛛池模板: 免费人妻无码不卡中文字幕系| www永久免费视频| 91精品啪在线观看国产线免费| 亚洲精品无码国产| 9久热精品免费观看视频| 亚洲情XO亚洲色XO无码| 精品成人免费自拍视频| 亚洲性天天干天天摸| 69视频在线观看免费| 亚洲一级片在线观看| 大陆一级毛片免费视频观看| 在线观看亚洲AV日韩AV| 国产成人无码a区在线观看视频免费 | 久久精品国产精品亚洲人人| rh男男车车的车车免费网站| 在线亚洲97se亚洲综合在线 | 久久精品亚洲综合| 3344永久在线观看视频免费首页| 亚洲精品在线播放| 无码一区二区三区免费视频| 美女无遮挡免费视频网站| 区久久AAA片69亚洲| 69视频在线观看高清免费| 亚洲精品av无码喷奶水糖心| 亚洲情a成黄在线观看| 久久免费观看国产精品| 亚洲免费人成视频观看| 免费视频淫片aa毛片| 精品国产福利尤物免费| 亚洲欧洲免费视频| 国产青草视频在线观看免费影院| 国产日韩AV免费无码一区二区三区| 亚洲一区二区三区日本久久九| 免费看的一级毛片| 成在线人视频免费视频| 国产精品免费视频观看拍拍| 久久精品国产96精品亚洲| 免费看片A级毛片免费看| 在线观看肉片AV网站免费| 成人区精品一区二区不卡亚洲| 亚洲综合色在线观看亚洲|