sizeof 和 strlen 的区别
#include <stdio.h> #include <string.h> int main (int argc, char **argv) { char *a = "0123456789"; char b[] = "0123456789"; char c[100] ="0123456789"; int d[100] ={0,1,2,3,4,5,6,7,8,9}; char e[8] = "abc0\0e123\0ed3\0f";
char f[] = "abc\\nt\012\xa1*2"; printf("char *a = \"%s\"\n",a); printf("char b[] = \"%s\"\n",b); printf("char c[100] = \"%s\"\n",c); printf("int d[100] = \"%s\"\n",d); printf("int e[8] = \"%s\"\n",e);
printf("int f[] = \"%s\"\n",f);
printf("--------------------\n"); printf("sizeof(a) = %d\n",sizeof(a)); printf("strlen(a) = %d\n",strlen(a)); printf("sizeof(b) = %d\n",sizeof(b)); printf("strlen(b) = %d\n",strlen(b)); printf("sizeof(c) = %d\n",sizeof(c)); printf("strlen(c) = %d\n",strlen(c)); printf("sizeof(d) = %d\n",sizeof(d)); printf("strlen(d) = %d\n",strlen(d)); printf("sizeof(e) = %d\n",sizeof(e)); printf("strlen(e) = %d\n",strlen(e));
printf("sizeof(f) = %d\n",sizeof(f));
printf("strlen(f) = %d\n",strlen(f)); } /* ----- End of main() ----- */
输出:
[zbq@centos6~/coder]$ gcc 6-3.c 6-3.c: 在函数‘main’中: 6-3.c:29: 警告:用以初始化字符数组的字符串太长 6-3.c:44: 警告:传递‘strlen’的第 1 个参数时在不兼容的指针类型间转换 /usr/include/string.h:399: 附注:需要类型‘const char *’,但实参的类型为‘int *’ [zbq@centos6~/coder]$ ./a.out char *a = "0123456789" char b[] = "0123456789" char c[100] = "0123456789" int d[100] = "" int e[8] = "abc0" -------------------- sizeof(a) = 4 strlen(a) = 10 sizeof(b) = 11 strlen(b) = 10 sizeof(c) = 100 strlen(c) = 10 sizeof(d) = 400 strlen(d) = 0 sizeof(e) = 8 strlen(e) = 4
sizeof(f) = 11
strlen(f) = 10
从以上的例子可以总结:
sizeof:
1.是操作符。
2.是计算在内存中预分配的大小,因此在预编译时计算,故可以用sizeof定义数组维数。
3.sizeof(d) = 400 说明数组的大小是各维数的乘积*数组元素的大小。
4.sizeof(e) = 8可以看出数组在内存中的大小是以维数为标准的,而非后面的初始化及所赋值。
strlen:
1.是函数。头文件是<string.h>
2.strlen的结果要在运行的时候才能计算出来,专用来计算字符串的长度(必须以"\0"结尾),而不是类型占内存的大小。
3.strlen(e) = 4 说明strlen是以"\0"为结束标志来计算字符串的长度的。
其中字符串常量"abc\\nt\012\xa1*2"在内存中所占储存空间字节数是
abc -- 3 个
\\ -- 1个 转义字符
nt -- 2 个
\012 -- 1个 8进制数
\xa1 -- 1个 16进制数
*2 -- 2 个
还有一个字符串结束符。 共 11 字节。