2015年8月20日

[讀書會] Intro to C and C++。4。Data Structure

噗浪連結按這裡,上課用的講義和作業按我

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?



2015年8月8日

[讀書會] Intro to C and C++。3。C Memory Management


噗浪連結還沒設,上課用的講義和作業按我

Computer memory

Heap:a chunk of memory that users can use to dynamically allocated memory. Lasts until freed, or program exits.
Stack:contains local variables from functions and related book-keeping data. LIFO. 從比較大的address開始?
Function variables are pushed onto stack when called. popped off stack when return.

Pointers/Addresses

每一個變數都是一個「位址」和「值」的組合。pointer是指向某個變數的變數 ,基本上就是那個變數的位址啦。
宣告的時候可以直接宣告變數的type(例如 int x、char x)
或是宣告變數的指標,只要在變數的類型前面加*就是了(例如 int* x、 char* x)。

變數前面加&就可以得到位址(例如變數x的位址 ptr = &x)
位址前面加*就可以得到那個位址上的值(x = *ptr)。用*ptr取得變數值的做法叫做dereferencing。

pointer本身也是變數,所以可以有pointer to pointer:char** ptr。

data type size:
  • char: 1 byte
  • bool: 1 byte
  • int: 4 byte
  • float: 4 byte
  • double: 8 byte
可以用sizeof(data type)取得!

Arrays
通常就是一堆memory。宣告方法是 data_type array_name[array_size] (例如 int x[5])。size定下來之後就不能改。可以用 {element1, element2, ...}初始化。用array_name[nth]取得第n個的值。
array_name就是指向array最開始的pointer。也等於&array_name[0]。
C沒有字串String這個type,字串要用char的array做。實際上char array的長度是總共字元加一,因為最後會有一個\0(是零,不是歐)用來null的東西。String可以用"xxx"來宣告,compiler懂。char則是用單括號'x'宣告。

Memory Allocation
#include
malloc(size)
realloc(pointer_name, size)
free(pointer_name)

2015年8月1日

[讀書會] Intro to C and C++。2。Core C

突然發現標題好像太長。

噗浪連結還沒設,上課用的講義和作業按我

Control Structures:用來控制要跑哪一段程式碼。重複跑、有條件的跑等等都辦的到喔。
  • while
  • do...while:保證起碼會會跑一次,不然跟while完全一樣。
  • for
  • if [else if], [...else]
  • switch
  • jumps:
    • continue
    • breaks:
    • return
    • goto:會讓 code 看起來很亂!
Variables and Functions
變數的種類有
  • 一般
  • const:不能改
  • static:數值會保留,不會因為出了function就消失
Scope
變數的Scope就是變數有定義的區塊。通常在指的是一開始被宣告的{ }之中。
Anonymous blocks 就是用{ } 刮起來,讓變數只在括號內有定義的區塊。

避免以下幾種情況:
  • Uninitialized variables. 沒有給初始值的變數
  • Out-of-bonds array access
  • Variables passed out of their defining function's scope
  • malloc
作業小心得:
在C裡,main() 是程式開始的地方。他只能有main(int argc, char ** argv)兩種參數。argc 是 argument count的縮寫,argv 是一個pointer,指向參數的地址。在作業一裡,如果要寫一個 function 把參數傳進去,只要給 function 同樣的參數 function(int argc, char ** argv) 就可以了。