sizeof使用中的幾個誤區總結

2021-07-02 22:06:20 字數 2452 閱讀 3464

例如:

char ss2="0123456789";

sizeof(ss2); //結果為11,而不是10

字元陣列ss2中包含隱含的』\0』,也算乙個字元,佔乙個位元組,所以ss2的總的大小為11位元組。

結構體的sizeof涉及到位元組對齊問題。

為什麼需要位元組對齊?計算機組成原理教導我們這樣有助於加快計算機的取數速度,否則就得多花指令週期了。為此,編譯器缺省會對結構體進行處理(實際上其它地方的資料變數也是如此),讓寬度為2的基本資料型別(short等)都位於能被2整除的位址上,讓寬度為4的基本資料型別(int等)都位於能被4整除的位址上,依次類推。這樣,兩個數中間就可能需要加入填充位元組,所以整個結構體的sizeof值就增長了。

位元組對齊的細節和編譯器的實現相關,但一般而言,滿足三個準則:

(1) 結構體變數的首位址能夠被其最寬基本型別成員的大小所整除。

(2) 結構體的每個成員相對於結構體首位址的偏移量(offset)都是成員大小的整數倍,如有需要,編譯器會在成員之間加上填充位元組(internal adding)。

(3) 結構體的總大小為結構體最寬基本型別成員大小的整數倍,如有需要,編譯器會在最末乙個成員後加上填充位元組(trailing padding)。

注意:空結構體(不含資料成員)的sizeof值為1。試想乙個「不佔空間「的變數如何被取位址、兩個不同的「空結構體」變數又如何得以區分呢,於是,「空結構體」變數也得被儲存,這樣編譯器也就只能為其分配乙個位元組的空間用於佔位了。

struct    

fig;

sizeof(fig); //結果為16

相應的資料對齊情況如下:

由圖可知長度為16位元組。

struct 

temp;

sizeof(temp); //結果為12

相應的資料對齊情況如下:

由圖可知長度為12位元組

聯合體union的定義方式與結構體一樣,但是二者有根本區別。

在結構體中各成員有各自的記憶體空間;而在聯合體中,各成員共享一段記憶體空間。

下面通過乙個例子來說明聯合體中各成員共享一段記憶體空間

union a;

a.x[0]=10;

a.x[1]=1;

cout

/結果為10

為什麼是10呢?我們下面通過分析聯合體內各成員的實際儲存來說明。

給聯合體a中的字元陣列x賦值,a中i的值也發生了改變,變成了00000000 00000000 00000001 00001010,即為256+10=266.

1)聯合體的結構空間要大於等於最長的乙個結構變數的空間

2)並且要能夠整除其他結構變數的資料長度,即聯合體空間對其他成員的元型別要能夠整除(int a[5],其元型別為int,元型別長度為4),實際上就是要取乙個元型別的最小公倍數。

union     

fighter;

sizeof(fighter); //結果為8,而不是5或者16

這個結構體中,各個結構變數的空間分別為4個位元組,5個位元組,4個位元組。通過(1)知結構體的空間至少為5個位元組,但是由(2)知5不能滿足條件,因此聯合體空間應該為8,因為8可以整除4(float、int長度)和1(char的長度)。

當陣列為形參時,其sizeof值相當於指標的sizeof值。

例如:

#include

using

namespace

std;

int test(char var)

int test2(char ba)

int main()

sizeof對乙個函式呼叫求值,結果是函式返回值的型別的大小。而且在使用中應該注意:

(1)不可以對返回值型別為空的函式求值。

(2)不可以對函式名求值,對含引數的函式,在用sizeof時,須寫上實參。

#include 

using

namespace

std;

float fun1(int a, float b)

int fun2()

void fun3()

int main()

電腦使用中的幾個誤區

1.正確開關機 養成正常的開關機習慣是很有必要的,在 xp作業系統下 按一下電腦開關鍵就自動進行開機 一直等到完全進入桌面系統前不要進行任何的操作 除非有問題進不了系統 正常情況下都是可以進入桌面的 如果想關機 有些朋友不喜歡按正常順序 點開始 關閉計算機,關閉 那也可以通過再按電腦主機上的開關鍵一...

關於sizeof 使用的幾個圈套

sizeof 指標變數 sizeof 陣列名 sizeof 作形參的陣列變數名 要點 在32位linux下 char str hello char p str int n 10 void func char str 100 void p malloc 100 sizeof str 6 sizeof ...

技術人溝通中的幾個誤區

溝通這個話題很大,所以今天的闡述的內容只針對80 以上的技術領域從業者會面對的場景。即便只是講技術團隊中的溝通,也足夠講幾天的課程了。所以,我選擇了 溝通誤區 這個話題作為切入點,通過一些具體事例來談談技術人溝通中的問題,來看看如何將溝通做到更好。誤區1 加強溝通就是多和人說話 這一點最大的問題,就...