• sizeof与strlen的区别


    转自:http://c.biancheng.net/view/342.html

    表面上看strlen和sizeof都是求字符串的长度,但是二者却存在着许多不同之处及本质区别

    strlen是一个函数,用来计算指定字符串的长度,但不包括结束字符(即null字符)。原型为

    size_t strlen(char const*str);

    也正因为strlen是一个函数,所以需要进行一次函数调用,如:

    char sArr[] = "ILOVEC";

    printf("sArr的长度=%d ",strlen(sArr));

    上面的代码运行结果为6(因为不包括结束符号null)。这里需要特别注意的是,函数strlen返回的是一个类型为size_t的值,从而有可能让程序产生意想不到的结果。如:

    if(strlen(x)>=strlen(y))

    {

      /*程序*/

    }

    if(strlen(x)-strlen(y)>=0)

    {

      /*程序*/

    }

    第一个程序能够完全按照预想的那样工作;但表达式2的结果永远为真,因为strlen的返回结果是size_t类型(无符号整型),因此绝对不可能是负数,即使表达式中同时包含了有符号整数和无符号整数,也会产生这种问题,因为有符号整数和无符号整数相加, 有符号的会转换成无符号的然后运算。

    关键字 sizeof 是一个单目运算符,而不是一个函数。与函数 strlen 不同,它的参数可以是数组、指针、类型、对象、函数等,如下面的示例代码所示:

    char sArr[]="ILOVEC"

    printf("sArr的长度=%d ",sizeof(sArr));

    该代码运行结果为7(因为它包括结束字符null),对sizeof而言,因为缓冲区已经用已知字符串进行了初始化,其长度是固定的,所以sizeof在编译时计算缓冲区的长度。也正是由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小。

  • 相关阅读:
    java进阶知识--File类
    java进阶知识--函数式接口
    java进阶知识--Lambda表达式、递归
    java进阶知识--线程池
    java进阶知识--线程安全
    java进阶知识--多线程入门
    java基础知识--异常
    java基础知识--可变参数
    mysql中如何不重复插入满足某些条件的重复的记录的问题
    有关map中使用iterate迭代器遍历的不保序问题和list remove(object)的细节问题
  • 原文地址:https://www.cnblogs.com/zgang/p/11585002.html
Copyright © 2020-2023  润新知