c語言的數組長度問題


c語言中定義一個數組,如何獲取數組的長度有時是我們必須所用到的。引出sizeofstrlen!

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是在編譯期執行的,這樣不會帶來錯誤,讓程序的可移植
性強些。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM