c語言中定義一個數組,如何獲取數組的長度有時是我們必須所用到的。引出sizeof和strlen!
1.sizeof與strlen()比較
strlen計算字符數組的字符數,以"\0"為結束判斷,不計算為'\0'的數組元素。
sizeof計算數據(包括數組、變量、類型、結構體等)所占內存空間,用字節數表示(當然用在字符數組計算"\0"的大小)。
舉例:{
int a[5]={1,3,5,7,9};
int i=sizeof(a)/sizeof(a[0]);//數組占用總內存除以單個元素所占的內存。
printf("數組的長度:%2d",i);//輸出數組有幾個元素的。
}
BUT:
1)sizeof(a)是不能獲取數組中元素的個數的,因為數組中還有個\0的結束符,此處得出的必定是多出一個元素!
2)但是通過數組名參數傳遞子函數中是行不通的:
2.sizeof有三種語法形式,如下:
1) sizeof( object ); // sizeof( 對象 );
2) sizeof( type_name ); // sizeof( 類型 );
3) sizeof object; // sizeof 對象;
所以:
{
int i;
sizeof(i);//This is right!
sizeof(int);//This is right!
sizeof i;//this is right!
sizeof int;//this is wrong!
}
BUT:
C99標准規定,函數、不能確定類型的表達式以及位域(bit-field)成員不能被計算s
izeof值,即下面這些寫法都是錯誤的:
sizeof( foo );// error
void foo2() { }
sizeof( foo2() );// error
struct S
{
unsigned int f1 : 1;
unsigned int f2 : 5;
unsigned int f3 : 12;
};
sizeof( S.f1 );// error
3. sizeof的常量性
sizeof的計算發生在編譯時刻,所以它可以被當作常量表達式使用,如:
char ary[ sizeof( int ) * 10 ]; // ok
最新的C99標准規定sizeof也可以在運行時刻進行計算,如下面的程序在Dev-C++中可以
正確執行:
int n;
n = 10; // n動態賦值
char ary[n]; // C99也支持數組的動態定義
printf("%d/n", sizeof(ary)); // ok. 輸出10
但在沒有完全實現C99標准的編譯器中就行不通了,上面的代碼在VC6中就通不過編譯。
所以我們最好還是認為sizeof是在編譯期執行的,這樣不會帶來錯誤,讓程序的可移植
性強些。
