• sizeof 与 strlen 的使用例子


    例子1

    char* s = "0123456789";
    sizeof(s);     //结果 4    ===》s是指向字符串常量的字符指针
    sizeof(*s);    //结果 1    ===》*s是第一个字符
    strlen(s);     //结果 10   ===》有10个字符,strlen是个函数内部实现是用一个循环计算到为止之前
    strlen(*s);     //结果 10   ===》错误,输入为char * str
    
    char s[] = "0123456789";
    sizeof(s);     //结果 11   ===》s是数组,计算到位置,因此是10+1
    strlen(s);     //结果 10   ===》有10个字符,strlen是个函数内部实现是用一个循环计算到为止之前
    sizeof(*s);    //结果 1    ===》*s是第一个字符
    
    char s[100] = "0123456789";
    sizeof(s);     //结果是100 ===》s表示在内存中的大小 100×1
    strlen(s);     //结果是10  ===》strlen是个函数内部实现是用一个循环计算到为止之前
    
    int s[100] = "0123456789";
    sizeof(s);     //结果 400  ===》s表示再内存中的大小 100×4
    strlen(s);     //错误      ===》strlen的参数只能是char* 且必须是以‘‘结尾的
    
    char q[]="abc";
    char p[]="a
    ";
    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,'','e','f','g'};
    sizeof(p);     //结果是8 ===》p表示在内存中的大小 8×1
    strlen(p);     //为一个随机值,结果与编译器有关,不同编译器结果一般不同
    sizeof(q);     //结果是8 ===》p表示在内存中的大小 8×1
    strlen(q);     //结果为4 ===》存在'',遇到''计算停止。
    // https://blog.csdn.net/magic_world_wow/article/details/80500473
    

    例子2-计算结构体大小

    struct Stu
    {
       int i;
       int j;
       char k;
    };
    
    Stu stu;
    printf("%d
    ",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

  • 相关阅读:
    Tutorial: Getting started with fuzzing The Go Programming Language https://go.dev/doc/tutorial/fuzz
    在Bash脚本中引入alias的问题
    因果推断:效应估计的常用方法及工具变量讨论 https://mp.weixin.qq.com/s/oNu3wim9mXGzW2D9eeq_CQ
    It is illegal to take the address of such an element; if s[i] is the i'th byte of a string, &s[i] is invalid.
    Go 高性能编程技法 知乎 https://zhuanlan.zhihu.com/p/482547957
    /etc/passwd
    /sbin/nologin
    Go 1.18 is released!
    树形表格
    nginx 静态文件 文件乱码
  • 原文地址:https://www.cnblogs.com/GuoXinxin/p/11651481.html
Copyright © 2020-2023  润新知