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是在编译期执行的,这样不会带来错误,让程序的可移植
性强些。