商務英語計算機英語

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具體的,我所知道的就這些了,那位高手還知道什麼,或者我寫的有什麼錯,希望指出。謝謝!

猜你喜歡

熱點閱讀

最新文章