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

posted @ 2017-10-25 22:26  梦醒青春时  阅读(15194)  评论(0编辑  收藏  举报