jasmine214--love

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

          C-sizeof解析

          Posted on 2010-11-29 17:13 幻海藍夢 閱讀(240) 評論(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
          主站蜘蛛池模板: 民勤县| 吉安县| 满洲里市| 屏东县| 靖州| 社旗县| 榆中县| 乌拉特后旗| 安达市| 灵川县| 定安县| 永济市| 岳西县| 抚松县| 肇源县| 磴口县| 体育| 禄丰县| 通江县| 广丰县| 南和县| 中阳县| 永善县| 丰顺县| 东丰县| 金川县| 双鸭山市| 长白| 远安县| 永昌县| 临城县| 岳阳市| 财经| 石城县| 吴旗县| 疏勒县| 方正县| 肥东县| 和平县| 丹江口市| 都匀市|