首先需要了解的基礎知識,也是非常重要的內容,就是C所定義的數據類型了。
通常計算機存儲的最小單位是字節(Byte),一個字節是8個bit。數據類型做佔用的字節數遵循ILP32或LP64規範,如下表所示。x86/Linux/gcc,遵循ILP32,並且char
是有符號的。
類型 | ILP32(位數) | LP64(位數) |
char | 8 | 8 |
short | 16 | 16 |
int | 32 | 32 |
long | 32 | 64 |
long long | 64 | 64 |
指針 | 32 | 64 |
當我們使用char *p=(char *)malloc(sizeof(char))開闢內存空間時,我們就獲得了1個字節的存儲空間,指針p指向該塊內存首地址。需要注意的是內存中的地址最小單位就是字節,而不是位,所以這個在這個特例中我們不能移動p,比如企圖向p+1的地址空間寫數據,可能引起崩潰。 查看了malloc後發現其實malloc分配的地址空間通常比我們要求的要大一些,所以可能p+1的位置還是能寫數據,我嘗試到p+4後調用free(p)會崩潰。
同樣,int *p=(int *)malloc(4*sizeof(int)),即申請了4*4=16個字節,每個整形佔用4字節,p就可以保存4個整形數據,可以使用下標或者指針移動來訪問這4個格子了。
同樣的我們可以申請更大的內存,需要注意的就是讀寫數據千萬在申請的範圍內了,用完後調用free()將內存還給操作系統。