日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

【转】c++中的sizeof

發布時間:2025/5/22 c/c++ 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转】c++中的sizeof 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
[int占4字節,short占2字節]

1.0?回答下列問題:[答案在文章末尾]

1.?sizeof(char)?=                           

2.?sizeof?'a'???=?                          

3.?sizeof?"a"???=?                       

4.?strlen("a")?=

  如果你答對了全部四道題,那么你可以不用細看下面關于sizeof的論述。如果你答錯了部分題目,那么就跟著我來一起探討關于sizeof的用法了。  

  對于前面的題目,我想一般有一定C基礎的同志應該不會答錯1和4題。至于第2題,我想應該要清楚sizeof是求字符串所占的內存。"a"在內存中的表現為a\0,別忘了末尾的\0也占一個字節呢。至于第2題,可能有些人會驚訝了。C?語言中,字符常數是int?型,?因此?sizeof('a')?是?sizeof(int),?這是另一個與?C++?不同的地方。既然字符常數是int?型,那么int就可以存放4個字符,我們可以得到sizeof?'abcd'為?4。  

1.1?回答以下題目[答案在文章末尾]

short?(*ptr[100])[200];

1.?sizeof(ptr)???????????=

2.?sizeof(ptr[0])????????=

3.?sizeof(*ptr[0])???????=

4.?sizeof((*ptr[0])[0]))?=?  

  是不是又開始暈了。這里我們定義了一個100個指針數組,每個指針均指向有200個元素的數組,其內存占用為200*sizeof(short)字節。那么這100個數組指針的大小sizeof(ptr)為100*sizeof(short*)。接著,指針數組的第一個指針ptr[0]指向第一個數組,所以這個指針ptr[0]的大小實際上就是一個普通指針的大小,即sizeof(short*)。*ptr[0]指向第一個數組的起始地址,所以sizeof(*ptr[0])實際上求的是第一個組的內存大小200*sizeof(short)。(*ptr[0])[0])是第一個數組的第一個元素,因為是short型,所以這個元素的大小sizeof((*ptr[0])[0]))等價于sizeof(short)。

1.2?回答以下題目[答案在文章末尾]

#include? <stdio.h>

#pragma?pack(push)

#pragma?pack(2)

typedef?struct?_fruit
{
??char??????????apple;
??int???????????banana;
??short?????????orange;???
??double????????watermelon;
??unsigned?int??plum:5;
??unsigned?int??peach:28;?
??char*?????????tomato;
??struct?fruit*?next;?????
}?fruit;

#pragma?pack(4)
??
typedef?struct?_fruit2
{
??char???????????apple;
??int????????????banana;???
??short??????????orange;
??double?????????watermelon;
??unsigned?int???plum:5;
??unsigned?int???peach:28;???
??char*??????????tomato;
??struct?fruit2*?next;?????
}?fruit2;??

#pragma?pack(pop)

int?main(int?argc,?char?*argv[])
{
??printf("fruit=%d,fruit2=%d\n",sizeof(fruit),sizeof(fruit2));
}

問題:打印結果為什么呢?

如果你回答錯誤,那么你對數據結構的對齊還沒有吃透。這里#pragma?pack(2)強制設置編譯器對齊屬性為2,所以第一個數據結構以2對齊,sizeof(fruit)=(sizeof(apple)+1)+sizeof(banana)+sizeof(orange)+sizeof(watermelon)+((plum:5bit+peach:28bit+15bit)/8bit)+sizeof(tomato)+sizeof(next)(注意式子中1?和?15bit?表示補齊內存,使其以2對齊,),既sizeof(fruit)=(sizeof(char)+1)+sizeof(int)+sizeof(short)+sizeof(double)+sizeof(char*)+sizeof(struct?fruit*)。第一個數據結構聲明完了之后,又使用#pragma?pack(4)強制設置編譯器對齊屬性為4,所以同理,可以得到sizeof(fruit2)=(sizeof(char)+3)+sizeof(int)+(sizeof(short)+2)+sizeof(double)+((5bit+28bit+31bit)/8bit)+sizeof(char*)+sizeof(struct?fruit2*)。


-----答案:

1.0:?1,4,2,1

1.1:?400,4,400,2

1.2:?fruit=30,fruit2=36

"這里我們定義了一個100個指針數組,每個指針均指向有200個元素的數組,其內存占用為200*sizeof(short)字節。那么這100個數組指針的大小sizeof(ptr)為100*sizeof(short*)。"

這里有錯誤,應該是定義了一個指針數組,該數組有100個元素,其中每一個元素都是一個指針,每個指針指向一個含有200個元素的數組。

總結

以上是生活随笔為你收集整理的【转】c++中的sizeof的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。