sizeof 与 strlen 的使用例子
例子1
char* s = "0123456789"; sizeof(s); //结果 4 ===》s是指向字符串常量的字符指针 sizeof(*s); //结果 1 ===》*s是第一个字符 strlen(s); //结果 10 ===》有10个字符,strlen是个函数内部实现是用一个循环计算到\0为止之前 strlen(*s); //结果 10 ===》错误,输入为char * str char s[] = "0123456789"; sizeof(s); //结果 11 ===》s是数组,计算到\0位置,因此是10+1 strlen(s); //结果 10 ===》有10个字符,strlen是个函数内部实现是用一个循环计算到\0为止之前 sizeof(*s); //结果 1 ===》*s是第一个字符 char s[100] = "0123456789"; sizeof(s); //结果是100 ===》s表示在内存中的大小 100×1 strlen(s); //结果是10 ===》strlen是个函数内部实现是用一个循环计算到\0为止之前 int s[100] = "0123456789"; sizeof(s); //结果 400 ===》s表示再内存中的大小 100×4 strlen(s); //错误 ===》strlen的参数只能是char* 且必须是以‘\0‘结尾的 char q[]="abc"; char p[]="a\n"; sizeof(q),sizeof(p),strlen(q),strlen(p);\\结果是 4 3 3 2 char p[] = {'a','b','c','d','e','f','g','h'}; char q[] = {'a','b','c','d,'\0','e','f','g'}; sizeof(p); //结果是8 ===》p表示在内存中的大小 8×1 strlen(p); //为一个随机值,结果与编译器有关,不同编译器结果一般不同 sizeof(q); //结果是8 ===》p表示在内存中的大小 8×1 strlen(q); //结果为4 ===》存在'\0',遇到'\0'计算停止。 // https://blog.csdn.net/magic_world_wow/article/details/80500473
例子2-计算结构体大小
struct Stu { int i; int j; char k; }; Stu stu; printf("%d\n",sizeof(Stu)); //结果 12 ===》内存补齐
为了CPU存取的速度最快,C语言在处理数据时经常把结构变量中的成员的大小按照4或8的倍数计算,这就叫数据对齐(data alignment)。
例子3
函数 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)”将永远为真。两个size_t 类型相减其结果仍然是size_t 类型。
同样,就算表达式中同时包含了有符号整数和无符号整数,还是有可能产生意想不到的结果
/*判断一*/ if(strlen(x)>= 5) { } /*判断二*/ if(strlen(x)- 5>=0) { }
很显然,判断表达式二的结果还是永远是真,其原因与上面相同。
为什么?
C语言中有符号数和无符号数进行运算(包括逻辑运算和算术运算)默认会将有符号数看成无符号数进行运算,其中算术运算默认返回无符号数,逻辑运算当然是返回0或1