#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 e123 ed3 f";
char f[] = "abc\nt 12xa1*2"; printf("char *a = "%s" ",a); printf("char b[] = "%s" ",b); printf("char c[100] = "%s" ",c); printf("int d[100] = "%s" ",d); printf("int e[8] = "%s" ",e);
printf("int f[] = "%s" ",f);
printf("-------------------- "); printf("sizeof(a) = %d ",sizeof(a)); printf("strlen(a) = %d ",strlen(a)); printf("sizeof(b) = %d ",sizeof(b)); printf("strlen(b) = %d ",strlen(b)); printf("sizeof(c) = %d ",sizeof(c)); printf("strlen(c) = %d ",strlen(c)); printf("sizeof(d) = %d ",sizeof(d)); printf("strlen(d) = %d ",strlen(d)); printf("sizeof(e) = %d ",sizeof(e)); printf("strlen(e) = %d ",strlen(e));
printf("sizeof(f) = %d ",sizeof(f));
printf("strlen(f) = %d ",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的结果要在运行的时候才能计算出来,专用来计算字符串的长度(必须以" "结尾),而不是类型占内存的大小。
3.strlen(e) = 4 说明strlen是以" "为结束标志来计算字符串的长度的。
其中字符串常量"abc\nt 12xa1*2"在内存中所占储存空间字节数是
abc -- 3 个
\ -- 1个 转义字符
nt -- 2 个