【转】c++中的sizeof
生活随笔
收集整理的這篇文章主要介紹了
【转】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個元素的數組。
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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux桌面版横评:三、Fedora
- 下一篇: 想起了她...