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 字节。
posted @ 2014-10-21 18:45  zhanbiqiang  阅读(296)  评论(0编辑  收藏  举报