商務英語計算機英語

c語言sizeof的用法

本文已影響 1.54W人 
ing-bottom: 56.25%;">c語言sizeof的用法
sizeof一般形式為:sizeof(object),也可以sizeofvar_char,不過大部分programer習慣用sizeof()。  物件可以是表示式或者資料型別名,當物件是表示式時,括號可省略。下面小編就為大家介紹c語言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)的時候,會output4.這就是32位的原因。sizeof(long)也是4.  如下:#include"stdio.h"#include"string.h"#include"stdlib.h"intmain(){  shortintsa=10;inta=10;longla=10;floatf=20;doubled=20;charch=''c'';  charstr[]="ABC";char*p=str;structstr{doubled;charch;intdata;}str_wu;structstr1{charch;doubled;intdata;}str_wu1;  printf("sizeof(short):%dn",sizeof(sa));printf("sizeof(int):%dn",sizeof(a));  printf("sizeof(long):%dn",sizeof(la));printf("sizeof(float):%dn",sizeof(f));printf("sizeof(double):%dn",sizeof(d));printf("sizeof(char):%dn",sizeof(ch));printf("sizeof(string):%dn",sizeof(str));  printf("sizeof(pointaddress):%dn",sizeof(p));printf("sizeof(Point):%dn",sizeof(*p));printf("sizeof(Struct):%dn",sizeof(str_wu));printf("sizeof(Struct):%dn",sizeof(str_wu1));system("pause");}  因而int,short的sizeof結果是一樣的額。  2.浮點型資料  float,double,longdouble  指標對於指標,要特別區分,指標指向什麼資料,它在記憶體佔的位元組數才是它的結果。比如:指標指向一個字串,就是字串的長度,因為一個字元在記憶體中佔一個位元組。若指標指向一個數據結構,則結果應該是結構型資料的記憶體位元組數。  4。結構型別  在上面的程式中,structstr{doubled;charch;intdata;}str_wu;structstr1{charch;doubled;intdata;  }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具體的,我所知道的就這些了,那位高手還知道什麼,或者我寫的有什麼錯,希望指出。謝謝!

猜你喜歡

熱點閱讀

最新文章

推薦閱讀