Memory issues:更多說明在這邊
- Illegal memory access (segmentation fault):本來只要讀寫n byte但多讀寫了一點,或是要讀null pointer
- Stack overflow:recursive function沒有停下來
- Double frees
- Uninitialized variables:變數沒有初始化
- Memory leaks: 佔了記憶體,但因為種種原因沒有釋放。會讓程式越跑越慢,嚴重時還會記憶體不足當機。造成的原因有:
- Reassignment:pointer被assign成別的值,被指向的記憶體就變孤兒了
- Freeing the parent block first:指標被先free掉了
- Improper handling of return values:function的return value是pointer,但呼叫函數的人沒把return value好好assign到變數
Structures and Unions:只有data的object的感覺
struct宣告:
struct struct_name{
//data set
int a;
char b
};
struct 變數宣告:
struct struct_name variable_name = {var, var...} 只能在宣告的時候用?
或用 struct_name.struct_member給值(平常也可以用)
Struct用pointer宣告:
struct struct_name* var_pointer_name = malloc(sizeof(struct struct_name));
var_pointer_name -> struct_member = 1;
struct memory:裡面的member要align。基本上幾byte的東西,開始位址一定就是幾byte的倍數。比如說short一定要開始在偶數位址,int的開始位址一定是4的倍數。中間有空的會用padding。可以用sizeof實驗看看。
memory alignment
Union:跟Struct很像但是只能用其中一個member。想不到存在的理由。
opaque types:
看不懂
Typedef
typefed exsiting_type alternate_name;
Enum
enum enum_name {member, member....};
作業
windows沒辦法裝Valgrind,另外google到一些類似軟體我也還沒搞清楚要怎麼用。借了我家阿宅的Mac結果OS版本太新Valgrind也不支援囧。
作業一的錯誤在於uninitialized variable x、x[10] out of bound 還有沒有free x?