前幾天遇到乙個神奇的bug,某些特殊情況下釋放動態陣列時竟然卡死,有些環境還報記憶體操作非法錯誤。最後發現原來是自己基礎知識還是不牢固,一些暗坑沒有留意。報錯**的大致如下。
#define int16u unsigned short
void test(int size)
當傳遞size引數為1時就卡死或報錯。
其原因是memset函式用法錯了。當陣列是靜態陣列時,sizeof(testarr)得到的結果就是陣列所佔記憶體的大小。但是當陣列是動態陣列時就不能這樣初始化,因為動態陣列testarr是乙個指標,它的size永遠是4,sizeof(testarr)的結果也是4。而當我們要申請乙個長度為1的int16u陣列時,它的實際記憶體只有2個位元組,memset卻操作了4個位元組。這就導致了記憶體操作錯誤。同樣的問題還會存在於動態char陣列、unsigned char陣列。
動態陣列初始化的正確做法應該是:memset(testarr,0,sizeof(型別)*長度)
結合上文的例子,修改為如下**後問題解決。
#define int16u unsigned short
void test(int size)
有些知識點腦子裡是記得清清楚楚,但是到了實際應用的時候缺總是沒注意到,說明基礎知識還是不牢固,慚愧慚愧。 c c 動態陣列
報錯 variable sized object may not be initialized 使用變數定義長度時,不可在定義時同時進行初始化賦值,需要在之後進行賦值 include include includeint main while scanf d d n,m 0 return 0 那為什...
筆記 動態陣列new和delete
1 c 中可以使用指標來動態建立陣列,具體的例子如下 建立乙個n n的矩陣 int result 定義乙個二維指標陣列 int n cin n result new int n for int i 0 inew int n for int i 0 ifor int j 0 j0 給陣列賦初值 下面對...
c c 動態申請陣列
new和delete運算子用於動態分配和撤銷記憶體的運算子 new用法 1.開闢單變數位址空間 1 new int 開闢乙個存放陣列的儲存空間,返回乙個指向該儲存空間的位址.int a new int 即為將乙個int型別的位址賦值給整型指標a.2 int a new int 5 作用同上,但是同時...