第二十七节 sizeof与strlen的深入
学校安排电气工程与自动化学院学生去校医院进行体检,远远就能听见测量身高那位医生一直在喊:“杨杰,170cm”,“范毅,160cm”……每个学生往测量身高的仪器一站,每个人身高都将会测量出来。 在C语言的数据类型中也一样,只要往sizeof中一放,每个数据类型占据了几个字节的内存也都一目了然。 1. 如程序清单7. 1所示,sizeof(a),sizeof(b)分别是多少? 程序清单7. 1 sizeof #include int main(int argc, char *argv[]) { char a[2][3] ; short b[2][3] ; printf( "sizeof(a) = %d n" , sizeof( a ) ) ; printf( "sizeof(b) = %d n" , sizeof( b ) ) ; return 0; } 由于char 是1个字节、short是2个字节,所以本题答案是: sizeof(a) = 6 sizeof(b) = 12 请按任意键继续. . . 为什么char是1个字节、short是2个字节呢? 并非说char占2个字节、short占2个字节、int占4个字节这些天生就是这样的,这与编译器有关。也就是说这些数据类型所占的字节数是会随着编译器的不一样而改变。由于本书使用的都是32位的编译器,那么其数据类型所占字节数的关系如下: char :1个字节 short int :2个字节 int : 4个字节 unsigned int :4个字节 float : 4个字节 double : 8个字节 好的,再来看看如程序清单7. 2所示,sizeof(a),sizeof(b)分别是多少? 程序清单7. 2 sizeof #include int main(int argc, char *argv[]) { char *a[2][3] ; short *b[2][3] ; printf( "sizeof(a) = %d n" , sizeof( a ) ) ; printf( "sizeof(b) = %d n" , sizeof( b ) ) ; return 0; } 是数组指针呢,还是指针数组呢?这里涉及*和[]和优先级的问题。我告诉大家的是这两个数组存放的都是指针变量,至于为什么,在后续章节会详细解释,然而指针变量所占的字节数为4字节,所以答案: sizeof(a) = 24 sizeof(b) = 24 请按任意键继续. . . 为什么指针变量所占字节数为4个字节呢? 我相信在看这本书的读者应该都知道指针,指针记录的是一个对象的地址。既然指针是来存放地址的,那么它当然等于计算机内部地址总线的宽度。所以在32位计算机中,一个指针变量的返回值必定是4个字节。这就是为什么指针变量所占字节数为4的原因。 留给读者一个思考题: int *ip; char *cp; double *dp; void *vp; printf("sizeof(ip) = %d n", sizeof(ip)); printf("sizeof(cp) = %d n", sizeof(cp)); printf("sizeof(dp) = %d n", sizeof(dp)); printf("sizeof(vp) = %d n", sizeof(vp)); 在这里读者要特别注意的是sizeof使用的时候后面会加括号,但是一个测量数据类型长度的关键字,而并非是一个函数,因此字节数的计算在程序编译时进行,而不是在程序执行的过程中计算出来。与sizeof具有类似功能的一个函数:strlen()。strlen()所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符' |