cpp
dynamic產生2d array,為什麼不能使用memset來設定初始值
segmentation fault
先看一般的固定陣列
arr是在程式執行時就被配置在heap/stack記憶體中,所以可以看到記憶體空間是連續的,每4Byte(int)
為一格
而memset的作用則是為一段連續空間賦值,所以能讓fixed array
透過memset
的方式填0
malloc
作用是請求一段連續的空間,並回傳ptr位置,但並不保證每次malloc都會是接續上次的位置,詳細看附圖與code
可以看到table[0][4]
最後一個元素的位置是[11081200],但是下一個元素table[1][0]
元素卻跳到[11081264]
在這種非連續配置的空間,使用memset就有可能不小心覆蓋到table[i]的pointer,導致
segmentation fault
我認為這error是這樣跳出的,但沒有很確定,不過方向應該是對的
像是這段code,嘗試存取非法空間,也會導致一樣的問題
最普通的方法
透過calloc來分配,會在分配時值就初始為0
如果要用memset
的話,就是要分別對每一個table[i]指標做memset
因為memset,是以char(1byte)為單位,一個一個byte去賦值
Value to be set. The value is passed as an int, but the function fills the block of memory using the unsigned char conversion of this value.
如果想賦值為10,可能會想這樣寫,但結果並不是這樣
前面提到是以byte為單位賦值,而int為32bit(4byte),賦值時其實是這樣的
這串二進制轉成10進制,10 << 24 | 10 << 16 | 10 << 8 | 10,就是168430090
所以想把動態int陣列初始化為任意number的話,只能用迴圈
畢竟memset原本的用處就是拿來產生n個char,所以這func才會在string.h中
Getting value from a dynamic allocated 2d array by pointers