用例子說明sizeof在應用時的注意事項

2021-10-08 10:44:30 字數 2003 閱讀 4628

錯誤示例:

// 課後習題14.5.cpp : 此檔案包含 "main" 函式。程式執行將在此處開始並結束。  

// 題目:  

// 編寫乙個簡單的模板類,它儲存兩個陣列,陣列的型別是通過模板引數列表指定的。陣列包含10個元素,模板類應包含訪問器函式,可用於運算元組元素。  

#include #include #include using namespace std;  

//template class cmark  

if ((sizeof(commonmark) / sizeof(float)) != (sizeof(exammark) / sizeof(float)))  

this->commonmark = new float[sizeof(commonmark) / sizeof(float) ];  

for (int i=0;i< (sizeof(commonmark) / sizeof(float));i++)  

this->exammark = new float[sizeof(exammark) / sizeof(float)];  

for (int i = 0; i < (sizeof(exammark) / sizeof(float)); i++)  

}  ~cmark()  

}  void showinf()  

}  };  

int main()  

, exammark[5] = ;  

cmark stud(commonmark, exammark);  

stud.showinf();  

}

這個**錯就錯在用new動態申請記憶體上面,在析構函式中commonmark是個傳入引數,它就是乙個指標,「sizeof(指標)=4」在預編譯時期就已經執行了,因此我們用「sizrof(commonmark)/sizeof(float)」求得的結果為1,而不是元素總個數5.

那有些同學疑問又來了:為什麼在main函式中sizeof(commonmark)=20,成員函式中sizeof(commonmark)=4呢?

commonmark在成員函式中是傳入引數,是個指標型變數,在預編譯時期,我們並不知道這個指標型變數是某乙個靜態陣列的首位址,我們只知道這個變數就是乙個指標。而main函式中不同由於commonmark=的出現,編譯器已經知道commonmark就是靜態陣列的首位址。

正確**示例:

// 課後習題14.5.cpp : 此檔案包含 "main" 函式。程式執行將在此處開始並結束。  

// 題目:  

// 編寫乙個簡單的模板類,它儲存兩個陣列,陣列的型別是通過模板引數列表指定的。陣列包含10個元素,模板類應包含訪問器函式,可用於運算元組元素。  

#include #include #include using namespace std;  

template class cmark  

this->commonmark = new float[number];  

for (int i=0;i< number;i++)  

this->exammark = new float[number];  

for (int i = 0; i < number; i++)  

}  ~cmark()  

}  void showinf(int number)  

}  };  

int main()  

, exammark[5] = ;  

int number = sizeof(commonmark) / sizeof(float);  

static_assert(sizeof(commonmark) == sizeof(exammark), "陣列元素個數不等");  

cmarkstud(commonmark, exammark, number);  

stud.showinf(number);  

}

用乙個例子說明VBS語法

dim arrcmdline 200 dim ntotalcmdline arrcmdline 1 sdfasdf arrcmdline 2 sdfasdf arrcmdline 3 gettrafile file tf.cpxx.cy1,beg yy mm dd,ter yy mm dd,iv h...

K8S在部署應用時,總提示OOMkilled

問題原因 linux核心限制,vm.map count引數預設設定過小 解決方法 vi etc sysctl.conf修改核心引數 新增一條屬性vm.max map count 300000 修改後sysctl p使配置生效 以上操作均要在root使用者下 root ks allinone vi e...

EDID在HDMI高畫質裝置中的應用說明

edid是vesa組織制定的pc顯示器的顯示格式資料規範,是hdmi介面的乙個重要組成部分。hdmi介面的傳送端和接收端,通過edid extended display identification data 來協商雙方傳輸的影象格式。傳送端通過讀取接收端的edid資料,來判斷接收端是否為hdmi裝...