青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

堅持學習/暴露問題/不斷提升

c++/設(shè)計模式/算法結(jié)構(gòu)/系統(tǒng)
posts - 2, comments - 20, trackbacks - 0, articles - 0

摘要:

Sizeof的作用非常簡單:求對象或者類型的大小。然而sizeof又非常復雜,它涉及到很多特殊情況,本篇把這些情況分門別類,總結(jié)出了sizeof的10個特性:

(0)sizeof是運算符,不是函數(shù);

(1)sizeof不能求得void類型的長度;

(2)sizeof能求得void類型的指針的長度;

(3)sizeof能求得靜態(tài)分配內(nèi)存的數(shù)組的長度!

(4)sizeof不能求得動態(tài)分配的內(nèi)存的大小!

(5)sizeof不能對不完整的數(shù)組求長度;

(6)當表達式作為sizeof的操作數(shù)時,它返回表達式的計算結(jié)果的類型大小,但是它不對表達式求值!

(7)sizeof可以對函數(shù)調(diào)用求大小,并且求得的大小等于返回類型的大小,但是不執(zhí)行函數(shù)體!

(8)sizeof求得的結(jié)構(gòu)體(及其對象)的大小并不等于各個數(shù)據(jù)成員對象的大小之和!

(9)sizeof不能用于求結(jié)構(gòu)體的位域成員的大小,但是可以求得包含位域成員的結(jié)構(gòu)體的大小!

概述:

Sizeof是C/C++中的關(guān)鍵字,它是一個運算符,其作用是取得一個對象(數(shù)據(jù)類型或者數(shù)據(jù)對象)的長度(即占用內(nèi)存的大小,byte為單位)。其中類型包含基本數(shù)據(jù)類型(不包括void)、用戶自定義類型(結(jié)構(gòu)體、類)、函數(shù)類型。數(shù)據(jù)對象是指用前面提到的類型定義的普通變量和指針變量(包含void指針)。不同類型的數(shù)據(jù)的大小在不同的平臺下有所區(qū)別,但是c標準規(guī)定所有編譯平臺都應(yīng)該保證sizeof(char)等于1。關(guān)于sizeof的更多概述你可以在msdn總輸入sizeof進行查詢。

看了上面這些,或許你看了沒有多少感覺。沒關(guān)系,下面我將詳細列出sizeof的諸多特性,這些特性是造成sizeof是一個較刁鉆的關(guān)鍵字的原因:

十大特性:

特性0:sizeof是運算符,不是函數(shù)

這個特性是sizeof的最基本特性,后面的很多特性都是受到這個特性的影響,正因為sizeof不是函數(shù),因此我們不把它所要求得長度的對象叫做參數(shù),我本人習慣上叫做操作數(shù)(這不嚴謹,但是有助于我記住sizeof是個操作符)。

特性1:sizeof不能求得void類型的長度

是的,你不能用sizeof(void),這將導致編譯錯誤:illegal sizeof operand。事實上你根本就無法聲明void類型的變量,不信你就試試void a;這樣的語句,編譯器同樣會報錯:illegal use of type 'void'。或許你要問為什么,很好,學東西不能只知其然,還要知其所以然。我們知道聲明變量的一個重要作用就是告訴編譯器該變量需要多少存儲空間。然而,void是“空類型”,什么是空類型呢,你可以理解成不知道存儲空間大小的類型。既然編譯器無法確定void類型的變量的存儲大小,那么它自然不讓你聲明這樣的變量。當然了,聲明void類型的指針是可以的!這就是特性2的內(nèi)容。

特性2:sizeof能求得void類型的指針的長度

在特性1中說過,可以申明void類型的指針,也就是說編譯器可以確定void類型的指針所占用的存儲空間。事實上確實如此,目前,幾乎所有平臺上的所有版本的編譯器都把指針的大小看做4byte,不信你試試sizeof(int*);sizeof(void*);sizeof(double*);sizeof(Person*);等等,它們都等于4!為什么呢?問得好,我將盡全力對此作出解釋:其實指針也是變量,只不過這個變量很特殊,它是存放其他變量的地址的變量。又由于目前32位計算機平臺上的程序段的尋址范圍都是4GB,尋址的最小單元是byte,4GB等于232Byte,這么多的內(nèi)存其地址如果編碼呢,只需要用32個bit就行了,而32bit = 32/8 = 4byte,也就是說只需要4byte就能存儲這些內(nèi)存的地址了。因此對任何類型的指針變量進行sizeof運算其結(jié)果就是4!

特性3:sizeof能求得靜態(tài)分配內(nèi)存的數(shù)組的長度!

Int a[10];int n = sizeof(a);假設(shè)sizeof(int)等于4,則n= 10*4=40;特別要注意:char ch[]=”abc”;sizeof(ch);結(jié)果為4,注意字符串數(shù)組末尾有’\0’!通常我們可以利用sizeof來計算數(shù)組中包含的元素個數(shù),其做法是:int n = sizeof(a)/sizeof(a[0]);

非常需要注意的是對函數(shù)的形參數(shù)組使用sizeof的情況。舉例來說,假設(shè)有如下的函數(shù):

void fun(int array[10])

{

         int n = sizeof(array);

}

你會覺得在fun內(nèi),n的值為多少呢?如果你回答40的話,那么我很遺憾的告訴你,你又錯了。這里n等于4,事實上,不管形參是int的型數(shù)組,還是float型數(shù)組,或者其他任何用戶自定義類型的數(shù)組,也不管數(shù)組包含多少個元素,這里的n都是4!為什么呢?原因是在函數(shù)參數(shù)傳遞時,數(shù)組被轉(zhuǎn)化成指針了,或許你要問為什么要轉(zhuǎn)化成指針,原因可以在很多書上找到,我簡單說一下:假如直接傳遞整個數(shù)組的話,那么必然涉及到數(shù)組元素的拷貝(實參到形參的拷貝),當數(shù)組非常大時,這會導致函數(shù)執(zhí)行效率極低!而只傳遞數(shù)組的地址(即指針)那么只需要拷貝4byte

特性4:sizeof不能求得動態(tài)分配的內(nèi)存的大小!

假如有如下語句:int* a = new int[10];int n = sizeof(a);那么n的值是多少呢?是40嗎?答案是否定的!其實n等于4,因為a是指針,在特性2中講過:在32位平臺下,所有指針的大小都是4byte!切記,這里的a與特性3中的a并不一樣!很多人(甚至一些老師)都認為數(shù)組名就是指針,其實不然,二者有很多區(qū)別的,要知詳情,請看《c專家編程》。通過特性3和特性4,我們看到了數(shù)組和指針有著千絲萬縷的關(guān)系,這些關(guān)系也是導致程序潛在錯誤的一大因素,關(guān)于指針與數(shù)組的關(guān)系問題我將在《C/C++刁鉆問題各個擊破之指針與數(shù)組的秘密》一文中進行詳細介紹。

特性3指出sizeof能求靜態(tài)分配的數(shù)組的大小,而特性4說明sizeof不能求的動態(tài)分配的內(nèi)存的大小。于是有人認為sizeof是編譯時進行求值的,并給出理由:語句int array[sizeof(int)*10];能編譯通過,而很多書上都說過數(shù)組大小是編譯時就確定下來的,既然前面的語句能編譯通過,所以認為sizeof是編譯時進行求值的。經(jīng)過進一步測試我發(fā)現(xiàn)這個結(jié)論有些武斷!至少是有些不嚴謹!因為在實現(xiàn)了c99標準的編譯器(如DEV C++)中可以定義動態(tài)數(shù)組,即:語句:int num;cin>>num; int arrary[num];是對的(注意在vc6.0中是錯的)。因此我就在DEV C++中對剛才的array利用語句int n =sizeof(array);cout<<n<<endl來求大小,結(jié)果編譯通過,運行時輸入num的值10之后,輸出n等于40!在這里很明顯num的值是運行時才輸入的,因此sizeof不可能在編譯時就求得array的大小!這樣一來sizeof又變成是運行時求值的了。

那么到底sizeof是編譯時求值還是運行時求值呢?最開初c標準規(guī)定sizeof只能編譯時求值,后來c99又補充規(guī)定sizeof可以運行時求值。但值得注意的是,即便是在實現(xiàn)了c99標準的DEV C++中仍然不能用sizeof求得動態(tài)分配的內(nèi)存的大小!

特性5:sizeof不能對不完整的數(shù)組求長度!

在闡述該特性之前,我們假設(shè)有兩個源文件:file1.cpp和file2.cpp,其中file1.cpp中有如下的定義:

int arrayA[10] = {1,2,3,4,5,6,7,8,9,10};

int arrayB[10] = {11,12,13,14,15,16,17,18,19,20};

file2.cpp包含如下幾個語句:

         extern arrayA[];

         extern arrayB[10];

         cout<<sizeof(arrayA)<<endl;            //編譯出錯!!

         cout<<sizeof(arrayB)<<endl;

在file2.cpp中第三條語句編譯出錯,而第條語句正確,并且能輸出40!為什么呢?原因就是sizeof(arrayA)試圖求不完整數(shù)組的大小。這里的不完整的數(shù)組是指數(shù)組大小沒有確定的數(shù)組!sizeof運算符的功能就是求某種對象的大小,然而聲明:extern int arrayA[]只是告訴編譯器arrayA是一個整型數(shù)組,但是并沒告訴編譯器它包含多少個元素,因此對file2.cpp中的sizeof來說它無法求出arrayA的大小,所以編譯器干脆不讓你通過編譯。

那為什么sizeof(arrayB)又可以得到arraryB的大小呢?關(guān)鍵就在于在file2.cpp中其聲明時使用extern int arrayB[10]明確地告訴編譯器arrayB是一個包含10個元素的整型數(shù)組,因此大小是確定的。

到此本特性講解差不多要結(jié)束了。其實本問題還能引申出連接和編譯等知識點,但是目前我暫時還沒自信對這兩個知識點進行詳細的,徹底的講解,因此不便在此班門弄斧,不久的將來我會在本系列中加上相關(guān)問題的闡述。

特性6:當表達式作為sizeof的操作數(shù)時,它返回表達式的計算結(jié)果的類型大小,但是它不對表達式求值!

為了說明這個問題,我們來看如下的程序語句:

char ch = 1;

         int num=1;

         int n1 = sizeof(ch+num);

         int n2 = sizeof(ch = ch+num);

假設(shè)char占用1byte,int占用4byte,那么執(zhí)行上面的程序之后,n1,n2,ch的值是多少呢?我相信有不少人會認為n1與n2相等,也有不少人認為ch等于2,事實這些人都錯了。事實上n1等于4,n2等于1,ch等于1,為什么呢?請看分析:

由于默認類型轉(zhuǎn)換的原因,表達式ch+num的計算結(jié)果的類型是int,因此n1的值為4!而表達式ch=ch+num;的結(jié)果的類型是char,記住雖然在計算ch+num時,結(jié)果為int,但是當把結(jié)果賦值給ch時又進行了類型轉(zhuǎn)換,因此表達式的最終類型還是char,所以n2等于1。n1,n2的值分別為4和1,其原因正是因為sizeof返回的是表達式計算結(jié)果的類型大小,而不是表達式中占用最大內(nèi)存的變量的類型大小!

對于n2=sizeof(ch =ch+num);乍一看該程序貌似實現(xiàn)了讓ch加上num并賦值給ch的功能,事實并非如此!由于sizeof只關(guān)心類型大小,所以它自然不應(yīng)該對表達式求值,否則有畫蛇添足之嫌了。但是,在支持變長數(shù)組定義的(即實現(xiàn)了c99標準的)編譯器(dev C++)中執(zhí)行了int len = 3;cout<<sizeof(int [++len])<<”,”<<len;輸出是多少呢?答案是16,4!這里的++len卻執(zhí)行了!很不可理喻吧?這到底是為什么呢?我翻閱了《The New C Standard》一書,這主要是由于可變長度的數(shù)組的長度需要在其長度表達式求值之后才能確定大小,因此上述情況下,sizeof中的++len執(zhí)行了。

正是因為sizeof的操作數(shù)中的某些表達式會被執(zhí)行,而有些表達式不會被執(zhí)行,這里告誡各位,盡量不要在sizeof中直接對表達式求大小,以免出現(xiàn)錯誤,你可以將sizeof(ch = ch+num);改寫成 ch = ch +num;sizeof(ch);雖然多了一條語句,看似冗余了,其實好處多多:首先更加清晰明了,其次不會出現(xiàn)ch等于1這樣的錯誤(假設(shè)程序的邏輯本身就是要執(zhí)行ch = ch +num;)。

特性7:sizeof可以對函數(shù)調(diào)用求大小,并且求得的大小等于返回類型的大小,但是不執(zhí)行函數(shù)體!

假設(shè)有如下函數(shù)(是一個寫得很不好的函數(shù),但是能很好的說明需要闡述的問題):

int fun(int& num,const int& inc)

{

         float div = 2.0;

         double ret =0;

         num = num+inc;

         ret = num/div;

         return ret;

}那么語句:

int a = 3;

         int b = 5;

         cout<<sizeof(fun(a,b))<<endl;

         cout<<a<<endl;輸出多少呢?不同的人會給出不同的答案,我將對sizeof(fun(a,b))的值和a的值分別進行討論:

首先sizeof(fun(a,b))的值:其正確是4,因為用sizeof求函數(shù)調(diào)用的大小時,它得到的是函數(shù)返回類型的大小,而fun(a,b)的返回類型是int,sizeof(int)等于4。很多人把函數(shù)的返回類型返回值的類型弄混淆了,認為sizeof(fun(a,b))的值是8,因為函數(shù)返回值是ret,而ret被定義成double,sizeof(doube)等于8。注意,雖然函數(shù)返回值類型是double,但是在函數(shù)返回時,將該值進行了類型轉(zhuǎn)換(這里的轉(zhuǎn)換不安全)。也有人錯誤的認為sizeof(fun(a,b))的值是12,它們的理由是:fun內(nèi)部定義了兩個局部變量,一個是float一個是double,而sizeof(float)+sizeof(doube)= 4+8=12。這樣的答案看似很合理,其實他們是錯誤地認為這里的sizeof是在求函數(shù)內(nèi)部的變量的大小了。這當然是錯誤的。

接下來看a的值:其正確答案是3!還記得特性6嗎?這里很類似,sizeof的操作對象是函數(shù)調(diào)用時,它不執(zhí)行函數(shù)體!為此,建議大家不要把函數(shù)體放在sizeof后面的括號里,這樣容易讓人誤以為函數(shù)執(zhí)行了,其實它根本沒執(zhí)行。

既然對函數(shù)條用使用sizeof得到的是函數(shù)返回類型的大小,那么很自然能得出這樣的結(jié)論:不能對返回類型為void的函數(shù)使用sizeof求其大小!原因請參考特性1。同理,對返回類型是任何類型的指針的函數(shù)調(diào)用使用sizeof求得的大小都為4,原因請參考特性2。

最后我們來看看這樣的語句:cout<<sizeof(fun);其答案是多少呢?其實它得不到答案,原因是編譯就通不過!最開始,我以為能輸出答案4,因為我認為fun是函數(shù)名,而我知道函數(shù)名就是函數(shù)的地址,地址就是指針,于是我認為sizeof(fun)其實就是對一個指針求大小,根據(jù)特性2,任何指針的大小都是4。可是當我去驗證時,編譯器根本不讓我通過!這個是為什么呢?我一時半會想不到,所以還請朋友們補充!

特性8:sizeof求得的結(jié)構(gòu)體(及其對象)的大小并不等于各個數(shù)據(jù)成員對象的大小之和!

結(jié)構(gòu)體的大小跟結(jié)構(gòu)體成員對齊有密切關(guān)系,而并非簡單地等于各個成員的大小之和!比如對如下結(jié)構(gòu)體兩個結(jié)構(gòu)體A、B使用sizeof的結(jié)果分別是:16,24。可以看出sizeof(B)并不等于sizeof(int)+sizeof(double)+sizeof(int)=16。

struct A{

         int num1;

         int num2;

         double num3;

};

struct B{

         int num1;

         double num3;

         int num2;

};

如果您不了解結(jié)構(gòu)體的成員對齊,你會感到非常驚訝:結(jié)構(gòu)體A和B中包含的成員都一樣,只不過順序不同而已,為什么其大小不一樣呢?要解釋這個問題,就要了解結(jié)構(gòu)體成員對齊的規(guī)則,由于結(jié)構(gòu)體成員對齊非常復雜,我將用專題——C/C++刁鉆問題各個擊破之位域和成員對齊——進行講解,這里我只簡單地介紹其規(guī)則:

1、 結(jié)構(gòu)體的大小等于結(jié)構(gòu)體內(nèi)最大成員大小的整數(shù)倍

2、 結(jié)構(gòu)體內(nèi)的成員的首地址相對于結(jié)構(gòu)體首地址的偏移量是其類型大小的整數(shù)倍,比如說double型成員相對于結(jié)構(gòu)體的首地址的地址偏移量應(yīng)該是8的倍數(shù)。

3、 為了滿足規(guī)則1和2編譯器會在結(jié)構(gòu)體成員之后進行字節(jié)填充!

 

基于上面三個規(guī)則我們來看看為什么sizeof(B)等于24:首先假設(shè)結(jié)構(gòu)體的首地址為0,第一個成員num1的首地址是0(滿足規(guī)則2,前面無須字節(jié)填充,事實上結(jié)構(gòu)體絕對不會在第一個數(shù)據(jù)成員前面進行字節(jié)填充),它的類型是int,因此它占用地址空間0——3。第二個成員num3是double類型,它占用8個字節(jié),由于之前的num1只占用了4個字節(jié),為了滿足規(guī)則2,需要使用規(guī)則3在num1后面填充4個字節(jié)(4——7),使得num3的起始地址偏移量為8,因此num3占用的地址空間是:8——15。第三個成員num2是int型,其大小為4,由于num1和num3一共占用了16個字節(jié),此時無須任何填充就能滿足規(guī)則2。因此num2占用的地址空間是16——19。那么是不是結(jié)構(gòu)體的總大小就是0——19共20個字節(jié)呢?請注意,別忘了規(guī)則1!由于結(jié)構(gòu)體內(nèi)最大成員是double占用8個字節(jié),因此最后還需要在num2后面填充4個字節(jié),使得結(jié)構(gòu)體總體大小為24。

按照上面的三個規(guī)則和分析過程,你可以很容易地知道為什么sizeof(A)等于16。特別需要說明的是,我這里給出了三個結(jié)論性的規(guī)則,而沒有闡述為什么要這樣。你或許有很多疑問:為什么要結(jié)構(gòu)體成員對齊,為什么要定義規(guī)則1等。如果你有這樣的疑問,并嘗試去弄清楚的話,那么我敢斷言,不久的將來你必定會有大成就,至少在學習c++上是這樣。前面說過,我會再寫一篇專題:C/C++刁鉆問題各個擊破之位域和成員對齊來詳細回答這些問題,如果你急于要弄明白,那么你可以參考其他資料,比如說《高質(zhì)量c++程序設(shè)計指南》。

最后再提醒一點,在進行設(shè)計時,最好仔細安排結(jié)構(gòu)體中各個成員的順序,因為你已經(jīng)看到了上面的結(jié)構(gòu)體B與結(jié)構(gòu)體A包含的成員相同,只不過順序略有差異,最終就導致了B比A多消耗了50%的空間,假如在工程中需要定義該結(jié)構(gòu)體的數(shù)組,多消耗的空降將是巨大的。即使將來內(nèi)存降價為白菜價格,你也不要忽視這個問題,勤儉節(jié)約是中國人民的優(yōu)良傳統(tǒng),我們應(yīng)該繼承和保持!

特性9:sizeof不能用于求結(jié)構(gòu)體的位域成員的大小,但是可以求得包含位域成員的結(jié)構(gòu)體的大小!

首先解釋一下什么是位域:類型的大小都是以字節(jié)(byte)為基本單位的,比如sizeof(char)為1byte,sizeof(int)為4byte等。我們知道某個類型的大小確定了該類型所能定義的變量的范圍,比如sizeof(char)為1byte,而1byte等于8bit,所以char類型的變量范圍是-128——127,或者0——255(unsigned char),總之它只能定義28=256個數(shù)!然而,要命的是bool類型只取值true和false,按理所只用1bit(即1/8byte)就夠了,但事實上sizeof(bool)等于1。因此我們可以認為bool變量浪費了87.5%的存儲空間!這在某些存儲空間有限的設(shè)備(比如嵌入式設(shè)備)上是不合適的,為此需要提供一種能對變量的存儲空間精打細算的機制,這就是位域。簡單來說,在結(jié)構(gòu)體的成員變量后面跟上的一個冒號+一個整數(shù),就代表位域,請看如下的結(jié)構(gòu)體:

Struct A

{

         Bool b:1;

         char ch1:4;

         char ch2:4;

}item; 其中b,ch1,ch2都是位域成員,而i是普通成員。該結(jié)構(gòu)體的試圖讓bool類型的變量b只占用1個bit,讓ch1和ch2分別只占用4個bit,以此來達到對內(nèi)存精打細算的功能(事實上使用位域?qū)?nèi)存精打細算有時候能成功,有時候卻未必,我將《C/C++刁鉆問題各個擊破之位域和成員對齊》進行論述)。另外需要特別注意的是:c語言規(guī)定位域只能用于int,signed int或者unsigned int類型,C++又補充了char和long類型!你不能這樣使用位域:float f:8;這是不能通過編譯的。并且位域變量不能在函數(shù)或者全局區(qū)定義,只能在結(jié)構(gòu)體,自定義類,聯(lián)合(union)中使用!

基于上面的結(jié)構(gòu)體,語句sizeof(item.b)和sizeof(item.ch1)等對位域成員求大小的語句均不能通過編譯。其原因能再本篇的概論中找到:sizeof以byte為單位返回操作數(shù)的大小!

那么愛學好問的你可能要問,sizeof(A)能否通過編譯呢?如何能,其結(jié)果又是多少呢?這是兩給非常好的問題,事實上我之前沒有看到任何關(guān)于這方面的論述(可能是我看的資料不足),我正是在看到sizeof(item.b)不能通過編譯時想到了這兩個問題,然后通過驗證得出了后面的結(jié)論:對包含位域的結(jié)構(gòu)體是可以使用sizeof求其大小的,但其求值規(guī)則比較復雜,不僅涉及到成員對齊,還與具體編譯環(huán)境有關(guān)!在這里你只需要知道可以對包含位域的結(jié)構(gòu)體使用sizeof求其大小,對于sizeof是根據(jù)什么規(guī)則來求這個大小的問題,我將會在專題:《C/C++刁鉆問題各個擊破之位域和成員對齊》中進行詳細闡述

后記:

至此,本專題差不多該結(jié)束了,需要說明的是,這里并沒有包含所有關(guān)于sizeof的知識點,但是也幾乎包含了所有的容易出錯的特性。為了完成該文,我花了斷斷續(xù)續(xù)3天半時間,想想效率實在是底下。由于是本系列的第一個專題,我格外慎重,深怕講錯了誤導大家。即便如此,也難免錯誤或不妥之處,還請各位朋友指正!

另外,我有幾句話要對大學生朋友們說:教科書通常只是教授很基礎(chǔ)的知識,要想深入學習,還需要翻閱其他資料,比如論文、網(wǎng)絡(luò)資料、論壇博文,最重要的一點是要在學習時經(jīng)常總結(jié)、記錄、歸納,積少成多,這樣堅持下來一定受益匪淺。 @import url(http://m.shnenglu.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);

Feedback

# re: C/C++刁鉆問題各個擊破之細說sizeof  回復  更多評論   

2011-08-09 19:22 by ZhangShine
準備寫書么?先頂一個

# re: C/C++刁鉆問題各個擊破之細說sizeof[未登錄]  回復  更多評論   

2011-08-09 20:52 by kkk
簡而言之sizeof是個編譯期的計算

# re: C/C++刁鉆問題各個擊破之細說sizeof  回復  更多評論   

2011-08-10 09:59 by zuhd
很詳細,質(zhì)量也不錯,幫頂

# re: C/C++刁鉆問題各個擊破之細說sizeof  回復  更多評論   

2011-08-10 11:20 by 二狗子_五哥
@ZhangShine
呵呵,沒打算寫書哈,寫出來就是為了交流而已

# re: C/C++刁鉆問題各個擊破之細說sizeof  回復  更多評論   

2011-08-10 11:23 by 二狗子_五哥
@kkk
在支持動態(tài)數(shù)組的平臺上sizeof同樣能計算數(shù)組的大小,因此不能簡單地說sizeof是編譯時計算結(jié)果的,比如在dev C++下如下語句能計算數(shù)組大小:
int len;
cin>>len;
int array[len];
cout<<sizeof(array);
輸出結(jié)果跟你輸入的len的大小有關(guān),這充分說明sizeof能在運行時求值!

# re: C/C++刁鉆問題各個擊破之細說sizeof  回復  更多評論   

2011-08-10 11:23 by 二狗子_五哥
@zuhd
謝謝....

# re: C/C++刁鉆問題各個擊破之細說sizeof  回復  更多評論   

2011-08-10 15:38 by 陳曉
受教了,哈哈,thank you

# re: C/C++刁鉆問題各個擊破之細說sizeof  回復  更多評論   

2011-08-10 16:51 by Hsssssss
@二狗子_五哥
int len;
cin>>len;
int array[len];//這句就該報錯了!len不是編譯期常量,不能當靜態(tài)數(shù)組的長度啊

# re: C/C++刁鉆問題各個擊破之細說sizeof  回復  更多評論   

2011-08-10 16:58 by Hsssssss
int len=3;
cout<<sizeof(int [++len])<<endl;
//vs.net中編譯通不過
//error C2540: non-constant expression as array bound

# re: C/C++刁鉆問題各個擊破之細說sizeof  回復  更多評論   

2011-08-10 17:14 by 陳昱(CY)
quote: “因此對任何類型的指針變量進行sizeof運算其結(jié)果就是4”

成員函數(shù)指針 不一定是4,詳情見
http://www.goingware.com/tips/member-pointers.html

# re: C/C++刁鉆問題各個擊破之細說sizeof  回復  更多評論   

2011-08-10 21:36 by 二狗子_五哥
@Hsssssss
我之前說得很清楚,必須在支持動態(tài)數(shù)組定義的編譯器中才能那么用,c99標準中新增加了動態(tài)數(shù)組的定義,vc沒有完全實現(xiàn)c99因此不能那么用,但是dev c++可以的。vc,vs不能定義數(shù)組要求其長度是常量,當然不能編譯了,但是dev c++用的是gcc編譯器,它支持動態(tài)數(shù)組定義,如果不信的話,你可以在windows環(huán)境下用dev c++編譯器試試,或者在linux環(huán)境下試試

# re: C/C++刁鉆問題各個擊破之細說sizeof  回復  更多評論   

2011-08-10 21:37 by 瘋狂的面包
@二狗子_五哥
你的代碼明顯是錯誤的, 又不是動態(tài)分配,sizeof顯然是編譯時確定數(shù)據(jù)的大小的

# re: C/C++刁鉆問題各個擊破之細說sizeof  回復  更多評論   

2011-08-10 21:38 by 二狗子_五哥
@Hsssssss
vs中c/c++編譯器跟vc雷同,不支持動態(tài)數(shù)組定義,我舉的例子是有前提的,您不能把那個前提拋開來看問題啊。

# re: C/C++刁鉆問題各個擊破之細說sizeof  回復  更多評論   

2011-08-10 21:42 by 二狗子_五哥
@瘋狂的面包
你在dev c++環(huán)境下,或者gcc編譯器中運行過我的代碼嗎?它是正確的,不同的編譯器實現(xiàn)不同而已,c標準的所有東西并非每個編譯器都完全實現(xiàn)了,而且c/c++標準本身也在發(fā)展中,的確,最初c/c++不支持定義變長數(shù)組,但是c99增加了相關(guān)內(nèi)容,而dev c++編譯器實現(xiàn)了這點,于是我的代碼在dev c++中就是對的。

# re: C/C++刁鉆問題各個擊破之細說sizeof  回復  更多評論   

2011-08-10 21:45 by 二狗子_五哥
@陳昱(CY)
非常感謝,我之前沒考慮到成員函數(shù)的指針問題,事實上我根本不知道這個問題,今天太晚了,明天把你提供的鏈接學習一下,然后修改之

# re: C/C++刁鉆問題各個擊破之細說sizeof  回復  更多評論   

2015-01-06 16:44 by 賈可
@二狗子_五哥
這個我估計編譯器可能把 sizeof 處理為 sizeof(int) * len 了

只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            日韩午夜av在线| 亚洲电影自拍| 亚洲日本理论电影| 一区二区三区日韩欧美| 伊甸园精品99久久久久久| 欧美日韩日韩| 欧美精品激情在线观看| 蜜桃av噜噜一区二区三区| 欧美一区午夜视频在线观看| 久久成人精品| 亚洲精品美女在线| 日韩视频一区二区在线观看 | 欧美视频在线播放| 久久综合导航| 久久精品国产久精国产爱| 性刺激综合网| 老色鬼久久亚洲一区二区| 91久久国产综合久久91精品网站| 亚洲人成网站777色婷婷| 亚洲精品乱码久久久久久黑人| 日韩亚洲综合在线| 亚洲一区二区少妇| 欧美大片第1页| 精品不卡一区| 一区二区精品国产| 夜夜嗨av一区二区三区网站四季av| 99精品国产在热久久| 久久伊人亚洲| 久久高清免费观看| 国产综合视频| 久久成人一区二区| 亚洲最新视频在线| 国产精品高潮呻吟久久av无限| 在线观看91久久久久久| 久久久国产精品一区二区中文 | 国产在线一区二区三区四区| 亚洲精品一区中文| 亚洲欧美不卡| 亚洲字幕一区二区| 国产精品啊啊啊| 夜夜嗨av色一区二区不卡| 久久综合99re88久久爱| 久久久久欧美| 日韩亚洲精品在线| 一区二区三区四区五区在线| 久久精品久久99精品久久| 91久久精品一区二区别| 久久精品国内一区二区三区| 狠狠久久亚洲欧美专区| 欧美在线视频一区二区| 亚洲国产一区在线观看| 欧美日韩国产欧| 亚洲精品欧美在线| 亚洲精品小视频在线观看| 久久国产精品一区二区三区| 国产亚洲欧洲一区高清在线观看| 久久婷婷人人澡人人喊人人爽| 欧美激情按摩| 亚洲香蕉在线观看| 香蕉成人伊视频在线观看| 亚洲国产精品999| 一本色道久久精品| 欧美日韩亚洲一区二区三区在线| 一区二区三区日韩在线观看| 午夜免费在线观看精品视频| 伊人久久婷婷色综合98网| 99视频一区二区| 国产精品国产福利国产秒拍| 这里只有精品电影| 欧美大片一区二区三区| 在线成人中文字幕| 亚洲综合日韩在线| 午夜视频久久久| 国产欧美一区二区三区另类精品| 亚洲视频香蕉人妖| 欧美日韩亚洲成人| 蜜臀99久久精品久久久久久软件| 欧美揉bbbbb揉bbbbb| 亚洲精品乱码久久久久久黑人| 久久天天躁狠狠躁夜夜av| 欧美一区日本一区韩国一区| 国产一区二区精品丝袜| 欧美久久久久中文字幕| 久久亚洲精选| 国产亚洲一区二区三区| 欧美一区日韩一区| 你懂的网址国产 欧美| 欧美成人午夜影院| 日韩视频免费| 国产九色精品成人porny| 久久精品国产精品亚洲综合 | 久久久国产91| 麻豆精品在线视频| 99综合在线| 国产在线欧美日韩| 欧美日韩免费区域视频在线观看| 亚洲综合色丁香婷婷六月图片| 性欧美在线看片a免费观看| 国产午夜精品视频免费不卡69堂| 免费人成精品欧美精品| 亚洲综合第一| 一区二区三区色| 1024亚洲| 国产欧美日韩精品丝袜高跟鞋| 蜜臀av一级做a爰片久久| 亚洲一区中文字幕在线观看| 亚洲人体1000| 久久久噜噜噜久久中文字免| 亚洲免费伊人电影在线观看av| 国产精品青草综合久久久久99| 欧美成人黑人xx视频免费观看| 亚洲一级在线观看| 日韩一区二区高清| 一本色道久久88精品综合| 亚洲国产婷婷| 亚洲精品看片| 日韩视频在线观看一区二区| 欧美激情精品久久久久久久变态 | 久久国产手机看片| 亚洲一二三区视频在线观看| 一本色道久久加勒比精品| 亚洲精品一区在线观看| 一本久道综合久久精品| 亚洲女人小视频在线观看| 亚洲视频在线观看| 亚欧美中日韩视频| 中日韩高清电影网| 欧美一区成人| 欧美激情一区二区三区全黄| 亚洲成色www8888| 亚洲人被黑人高潮完整版| 亚洲精品在线三区| 亚洲欧美日韩国产成人精品影院| 久久电影一区| 欧美成人免费全部| 国产在线观看精品一区二区三区| 亚洲第一福利在线观看| 亚洲在线免费| 欧美激情一区二区三区在线| 亚洲在线视频观看| 久久深夜福利| 国产精品久久久久秋霞鲁丝 | 欧美亚洲一区| 美脚丝袜一区二区三区在线观看 | 久久色在线播放| 欧美少妇一区| 99pao成人国产永久免费视频| 国产精品亚洲一区| 一区二区三区精品| 欧美韩国日本综合| 久久久国产视频91| 国产丝袜一区二区| 香港成人在线视频| 亚洲永久免费av| 国产精品久久久久9999吃药| 亚洲精品欧美激情| 亚洲精选在线观看| 欧美日韩中文字幕在线视频| 夜夜嗨av一区二区三区免费区| 亚洲人妖在线| 国产精品国产a| 久久久久国产一区二区三区| 久久综合五月天婷婷伊人| 欧美理论电影在线播放| 99精品视频免费在线观看| 亚洲欧美激情四射在线日| 国产亚洲精品高潮| 欧美激情片在线观看| 欧美日韩国产在线一区| 欧美综合激情网| 女女同性女同一区二区三区91| 一区二区高清在线观看| 欧美一区二区视频在线观看| 影音先锋亚洲视频| 亚洲一二三区视频在线观看| 国产综合网站| 亚洲一区3d动漫同人无遮挡| 国内精品美女av在线播放| 日韩亚洲欧美成人一区| 亚洲高清三级视频| 亚洲欧美日韩国产综合在线 | 欧美一区三区二区在线观看| 91久久精品一区| 亚洲精品视频在线播放| 国产精品av久久久久久麻豆网| 裸体女人亚洲精品一区| 欧美日韩一区二区三区四区在线观看| 久久精品99| 国产欧美精品一区| 亚洲男人的天堂在线观看| 在线亚洲电影| 欧美日韩天天操| 亚洲高清激情| 久久av红桃一区二区小说| 欧美中文字幕视频| 国产精品专区一| 久久精品在线| 最新国产乱人伦偷精品免费网站 | 欧美成人久久| 日韩网站免费观看|