zoukankan      html  css  js  c++  java
  • 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] = "abc0e123ed3f";
        char f[] = "abc\nt12xa1*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\nt12xa1*2"在内存中所占储存空间字节数是

    abc -- 3 个
    \ -- 1个 转义字符
    nt -- 2 个
    12 -- 1个 8进制数
    xa1 -- 1个 16进制数
    *2 -- 2 个
    还有一个字符串结束符。 共 11 字节。
  • 相关阅读:
    使用goto跳转到switch的某个case 拓荒者
    sql server 跨服务器查询 拓荒者
    [转]ASP.NET 缓存:方法和最佳实践 拓荒者
    asp.net gridview 和 repeater 模板代码示例 拓荒者
    【转】配置子目录Web.config使其消除继承,用虚拟目录创建多个网站的方法 拓荒者
    PostSharp Thread Dispatching(GUI多线程)
    Silverlight获取WebHost配置信息WebClient和XmlSerializer模拟
    Google Chrome 語音辨識
    MSBuild + MSILInect实现编译时AOP之预览
    Silverlight DataGrid行背景分组着色
  • 原文地址:https://www.cnblogs.com/zhanbiqiang/p/4039327.html
Copyright © 2011-2022 走看看