最近在論壇裡總有人問關於sizeof的問題,並且本人對這個問題也一直沒有得到很好的解決,索性今天對它來個較為詳細的總結,同時結合strlen進行比較,如果能對大家有點點幫助,這是我最大的欣慰了。
一、好首先看看sizeof和strlen在MSDN上的定義:
首先看一MSDN上如何對sizeof進行定義的:
sizeof Operator sizeof expression The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type (including aggregate types). This keyword returns a value of type size_t. The expression is either an identifier or a type-cast expression (a type specifier enclosed in parentheses). When applied to a structure type or variable, sizeof returns the actual size, which may include padding bytes inserted for alignment. When applied to a statically dimensioned array, sizeof returns the size of the entire array. The sizeof operator cannot return the size of dynamically allocated arrays or external arrays.
然後再看一下對strlen是如何定義的:
strlen Get the length of a string. Routine Required Header: strlen <string.h> size_t strlen( const char *string ); Parameter string:Null-terminated string Libraries All versions of the C run-time libraries. Return Value Each of these functions returns the number of characters in string, excluding the terminal NULL. No return value is reserved to indicate an error. Remarks Each of these functions returns the number of characters in string, not including the terminating null character. wcslen is a wide-character version of strlen; the argument of wcslen is a wide-character string. wcslen and strlen behave identically otherwise.
二、由幾個例子說開去。
第一個例子:
char* ss = "0123456789"; sizeof(ss) 結果 4 ===》ss是指向字符串常量的字符指針 sizeof(*ss) 結果 1 ===》*ss是第一個字符 char ss[] = "0123456789"; sizeof(ss) 結果 11 ===》ss是數組,計算到\\\\\\\\0位置,因此是10+1 sizeof(*ss) 結果 1 ===》*ss是第一個字符 char ss[100] = "0123456789"; sizeof(ss) 結果是100 ===》ss表示在內存中的大小 100×1 strlen(ss) 結果是10 ===》strlen是個函數內部實現是用一個循環計算到\\\\\\\\0為止之前 int ss[100] = "0123456789"; sizeof(ss) 結果 400 ===》ss表示再內存中的大小 100×4 strlen(ss) 錯誤 ===》strlen的參數只能是char* 且必須是以\\\\\\\\\\\\\\\\\\\\\\\0\\\\\\\\\\\\\\\結尾的 char q[]="abc"; char p[]="a\\\\\\\\n"; sizeof(q),sizeof(p),strlen(q),strlen(p); 結果是 4 3 3 2
第二個例子:
class X { int i; int j; char k; }; X x; cout<<sizeof(X)<<endl; 結果 12 ===》內存補齊 cout<<sizeof(x)<<endl; 結果 12 同上
第三個例子:
char szPath[MAX_PATH]
如果在函數內這樣定義,那麼sizeof(szPath)將會是MAX_PATH,但是將szPath作為虛參聲明時(void fun(char szPath[MAX_PATH])),sizeof(szPath)卻會是4(指針大小)
三、sizeof深入理解。
short f(); printf("%d\\\\\\\\n", sizeof(f()));輸出的結果是sizeof(short),即2。
char str[20]="0123456789"; int a=strlen(str); //a=10; int b=sizeof(str); //而b=20;
fun(char [8]) fun(char [])都等價於 fun(char *) 在C++裡傳遞數組永遠都是傳遞指向數組首元素的指針,編譯器不知道數組的大小如果想在函數內知道數組的大小, 需要這樣做:進入函數後用memcpy拷貝出來,長度由另一個形參傳進去
fun(unsiged char *p1, int len) { unsigned char* buf = new unsigned char[len+1] memcpy(buf, p1, len); }有關內容見: C++ PRIMER?
四、結束語
sizeof使用場合。
void *malloc(size_t size), size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream)。
void * memset(void * s,int c,sizeof(s))