C笔试------sizeof,strlen
第一个例子
char* ss = "0123456789";
sizeof(ss) 结果4 . ss是指向字符串常量的字符指针,对于一个指针来说,它在内存占用的空间一定是4个字节
sizeof(*ss) 结果1. *ss是第一个字符, sizeof对某种类型使用时,返回的是该类型在内存中占用的空间。
strlen(ss) = 10. Strlen的参数为字符数组,或者是字符指针,返回字符数组中的字符个数,不包括'\0'。
Strlen(*ss) 是错误的,因为*ss是一个字符,而不是一个字符串指针。
char ss[] = "0123456789";
sizeof(ss) 结果 11. ss是数组,计算到\0位置,因此是10+1
sizeof(*ss) 结果 1 . *ss是第一个字符
strlen(ss) = 10. Strlen的参数为字符数组,或者是字符指针,返回字符数组中的字符个数,不包括'\0'。
Strlen(*ss) 是错误的,因为*ss是一个字符,而不是一个字符串指针。
char ss[100] = "0123456789";
sizeof(ss) 结果是100 . ss表示在内存中的大小 100×1.s 虽然ss中只存放了11个元素,但是它的静态大小(即一开始定义的,系统分配给它的)为100.
strlen(ss) 结果是10. Strlen是一个函数,它不管你的数组是多大的,它返回的是里面存放的元素个数,所以它从头开始找,直到'\0'。
int ss[100] = "0123456789";
sizeof(ss) 结果 400 . ss表示再内存中的大小 100×4
strlen(ss) 错误. strlen的参数只能是char* 且必须是以''\0''结尾的
第二个例子:
class X {
int i;
int j;
char k;
};
X x;
class Y{
};
cout<<sizeof(X)<<endl; 结果 12。 由于X中参数字节最长的是int型,它是4字节的,未超过处理器的位数,所以它必须按4字节对齐,也就是说sizeof(X)必须能够整除4.所以最后一个成员k虽然只占了一字节,但是它后面有3字节是空着的。如果超过的处理器的位数,则按处理器的位数进行对齐。
cout<<sizeof(x)<<endl; 同上
sizeof(Y) = 1;
第三个例子:
char szPath[MAX_PATH]
如果在函数内这样定义,那么sizeof(szPath)将会是MAX_PATH,但是将szPath作为虚参声明时(void fun(char szPath[MAX_PATH])),sizeof(szPath)却会是4(指针大小)
[sizeof和strlen的区别]
(1) sizeof是运算符,strlen是函数。
(2) sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。sizeof还可以用函数做参数,比如:short f(); printf("%d\n", sizeof(f()));输出的结果sizeof(short)即2
(3) 数组做sizeof的参数不退化,传递给strlen就退化为指针了。
(4) 大部分编译程序 在编译的时候就把sizeof计算过了, 是用于计算类型或是变量的长度,这就是sizeof(x)可以用来定义数组维数的原因。strlen的结果要在运行的时候才能计算出来,是用来计算字符串的长度,不是类型占内存的大小。
(5) 当使用于一个结构体类型或变量时,sizeof 返回实际的大小,当适用一静态地空间数组,sizeof 归还全部数组的尺寸。sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸
(6) 数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址,相当于一个指针,所以strlen的参数可以是字符串指针,也可以是字符数组首地址,但一定需要'\0'作为结尾。
(7)sizeof计算结构体变量,类的大小时,必须讨论数据对齐问题。
浙公网安备 33010602011771号