1.sizeof
1.1 当使用了一个结果类型或变量时,sizeof 返回实际的大小。当使用一静态的空间数据时,sizeof返回全部数组的尺寸。
sizeof操作符不能返回被动态分配的数据或外部的数组的尺寸
1.2 大部分编译程序在编译的时候就把sizeof 计算过了,是类型或则变量的长度,所以sizeof(x)可以定义数组的维数
char str[20];
int b=sizeof(str);
int a[b];
2.strlen
2.1. strlen的参数只能是 char *,且必须是以’\0‘结尾的
2.2. strlen的结果要在运行的时候才能计算出来,用来计算字符串的长度,而不是类型占内存的大小
需要特别注意的是,函数 strlen 返回的是一个类型为 size_t 的值,从而有可能让程序导致意想不到的结果,如下面的示例代码所示:
/*判断一*/ if(strlen(x)>= strlen(y)) { } /*判断二*/ if(strlen(x)- strlen(y)>= 0) { }
从表面上看,上面的两个判断表达式完全相等,但实际情况并非如此。其中,判断表达式一没什么问题,程序也能够完全按照预想的那样工作;但判断表达式二的结果就不一样了,它将永远是真,这是为什么呢?
原因很简单,因为函数 strlen 的返回结果是 size_t 类型(即无符号整型),而 size_t 类型绝不可能是负的。因此,语句“if(strlen(x)-strlen(y)>=0)”将永远为真。
同样,就算表达式中同时包含了有符号整数和无符号整数,还是有可能产生意想不到的结果,如下面的代码所示:
/*判断一*/ if(strlen(x)>= 5) { } /*判断二*/ if(strlen(x)- 5>=0) { }
很显然,判断表达式二的结果还是永远是真,其原因与上面相同。
例子:
char *q3 ="a\n";
sizeof(q3)为4,指针的大小就是一个定值,就是4
strlen(q3) 为2
char ss1[]= "0123"
sizof(ss1) 为5,因为包含‘\0‘
strlen(ss1) 为4
char ss2[]={'6','0','2','3'};
sizof(ss2) 为4
strlen(ss2) 为4
char ss3[100]="0123";
sizeof(ss3) 为100
strlen(ss3) 结果为4,它的内部是一个循环计算字符串的长度,直到’\0‘为止
int ss4[100];
sizeof(ss4) 为400,因为int占4个字节
strlen(ss4) 错误,strlen的参数只能是 char *,且必须是以’\0‘ 结尾的
char str[20];
strlen(str) 得到的值错误,因为要 strlen 要以’\0‘结尾
char str[2]="23";
strlen(str) 得到的值错误,因为要 strlen 要以’\0‘结尾,这里数组定义太小了
sizeof 计算栈中分配的大小,其他区域是不会计算在内的
class A
{
public:
int a;
static int b;
}
sizeof(A1) 为4, 因为静态变量存放在全局数据区