一、sizeof運算符的用法
1.sizeof運算符給出某個類型或變量在內存中所占據的字節數。
int a; sizeof(a)=4; //sizeof(int)=4;
double b; sizeof(b)=8; //sizeof(double)=8;
2.數組的sizeof值等於數組所占用的內存總字節數。
如:char a[] = "yes"; sizeof(a); // 結果為4,字符末尾還存在一個NULL終止符
int a[3]; sizeof(a); // 結果為3*4=12,3個int類型
在學數組和函數那塊是遇到的sizeof就是在求數組的長度:
int a = sizeof(a1) / sizeof(a1[0]); // 總長度/第一個元素的長度
3. 指針變量的sizeof值與指針所指的對象沒有任何關系,所有的指針變量所占內存大小相等。(不同的編譯器指針變量所占內存大小不同)
char *p = "abc";
int *q;
string *s;
sizeof( p ); // 結果為4
sizeof( q ); // 結果為4
sizeof( s ); // 結果為4
如果操作數是函數中的數組形參或函數類型的形參,sizeof給出其指針的大小。
void (*p)();// 函數指針
sizeof( p );// 結果為4
二、malloc函數(內存的動態分配)
1.malloc函數原型:
void *malloc(unsigned int size);
malloc向系統申請分配指定size個字節堆內存連續空間,返回類型是 void* 類型,void* 表示未確定類型的指針。在C語言中,void* 類型可以強制轉換為任何其它類型的指針。
p = malloc (sizeof(int)*n);//隱式類型轉換,分配n個整數內存空間
p = (int *) malloc (sizeof(int)*n);//顯式強制類型轉換,分配n個整數內存空間
函數返回值是所分配區域的第一個字節的地址,如果申請分配內存失敗,則返回空指針(NULL)。
2.申請了內存空間后,必須檢查是否分配成功。
q=(DLNode *)malloc(sizeof(DLNode)); if(!q) return OVERFLOW;
3.雖然malloc()函數的類型是(void *),任何類型的指針都可以轉換成(void *),但習慣上進行顯式強制類型轉換。
三、free函數的用法
1.free函數原型:
void free(void *p);//無返回值
free()函數釋放變量p所指向的動態內存空間,p應該是最近一次調用malloc函數時得到的函數返回值。
free( p );//釋放動態空間
2.當不需要再使用申請的內存時,一定要記得釋放,如果申請后不釋放就會造成內存泄漏。
3.malloc函數和free函數應該是配對使用的,且釋放只能一次。
最后,sizeof在后面的結構體和聯合體中用的會更深入一些,待學到那塊時再來補充總結。