zoukankan      html  css  js  c++  java
  • sizeof与strlen的区别

    格式:strlen(字符数组名)
    功能:计算字符串S的长度,不包括‘'在内
    char aa[10]="jun"; cout<<strlen(aa)<<endl; //结果为3
    char aa[5]="hello";cout<<strlen(aa)<<endl; //结果为不定值
     
    sizeof()返回的是变量声明后所占的内存数,不是实际长度,此外sizeof不是函数,仅仅是一个操作符,strlen是函数。
     
    区别:
    1.sizeof的结果类型是size_t(也就是unsigned int型),该类型保证能容纳所建立的最大对象的大小。
    2.sizeof是操作符(关键字),strlen是函数。
    3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是’‘结尾的。
    4.数组做sizeof的参数不退化,传递给strlen就退化为指针了。
    5.大部分编译程序在编译的时候就把sizeof计算过了是类型或是变量的长度。所以sizeof(x)可以用来定义数组维数,strlen的结果要在运行的时候才能计算出来,是用来计算字符串的长度,不是类型占内存的大小。
    6.sizeof后如果是类型必须加括号,如果是变量名可以不用加括号。
    PS:对函数使用sizeof,在编译阶段会被函数返回值的类型取代。
     
    问:一个空类占多少空间?多重继承的空类呢?
    分析: 空类型的实例中不包含任何信息,所以sizeof本来应该为0,但是当声明该类型的实例时,它必须在内存中占用一定空间,否则无法使用这些实例。至于具体占用多少,由编译器决定。Visual Studio中每个空类型的实例占用一字节的空间。因此无论是单一继承,还是多重继承,空类所占空间都为1。
     
    :如果在该类型(空类型)中添加一个构造函数和一个析构函数,再对它求sizeof,得到的结果又是多少?
    分析:一样为1.因为调用构造函数与析构函数所需的地址只与类型有关,与类型的实例无关,所以实例中不会因为这两个函数添加额外的信息。
     
    问:那如果把析构函数标记为虚函数呢?
    分析:C++编译器一旦在某个类型中发现有虚函数,就会为该类型生成一个虚函数表,并在该类型的每一个实例中添加指向该虚函数表的指针。因此,在32为系统中,指针占用4字节的内存,所以sizeof的值为4,而在64位系统中则为8.
  • 相关阅读:
    java.sql.SQLException: Value '0000-00-00 00:00:00' can not be represented as java.sql.Date
    权限控制-JS判断是否有权限进行操作跳转页面需要加target
    为你的网站装个“头像”
    本地存储由来的背景
    HTML5的新的结构元素介绍
    Canvas绘图API
    HTML5文件操作API
    认识HTML5
    基于scrapy爬虫的天气数据采集(python)
    Python strip()方法
  • 原文地址:https://www.cnblogs.com/happygirl-zjj/p/4628282.html
Copyright © 2011-2022 走看看