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

    strlen与sizeof都可以用来计算相关字符指针和字符数组的长度,容易混淆。这里用实际例子对它们加以区分。

    总的来说:strlen是用来计算字符串的字符个数(不含'')的函数;而sizeof是用来计算类型或者变量的存储大小的操作符(而不是函数),因此sizeof的结果是在编译阶段就能确定的。

    题目:
    char *p1 = "12345678"; 
    char p2[] = "12345678";
    char p3[1024]="12345678"; 
    char p4[] = {'1','2','3','4','5','6','7','8'}; 
    sizeof(p1)=? 
    sizeof(p2)=? 
    sizeof(p3)=? 
    sizeof(p4)=? 
    strlen(p1)=? 
    strlen(p2)=? 
    strlen(p3)=?
    strlen(p4)=? 
    分析:

    p1是一个字符指针,指向了静态常量区的一个常量字符串,"12345678"。所以,sizeof(p1)=指针的长度=4;strlen(p1)=字符串"12345678"的长度(不含''),所以是8。 

    p2是一个字符数组,由静态常量区的"12345678"进行初始化。所以sizeof(p2)是计算数组p2的长度,所以结果为"12345678"的所有字符的长度(含''),所以是9。 strlen(p2)也是在计算"12345678"的长度(不含''),所以是8。
     
    p3是一个字符数组,由静态常量区的"12345678"进行初始化,但长度为1024。 所以,sizeof(p3)=1024;strlen(p3)为字符串"12345678"的长度(不含''),所以是8。 

    p4是一个字符数组,由字符'1','2','3','4','5','6','7','8'进行初始化, 这样初始化与"12345678"进行初始化的区别是 前者不包含''。因此,sizeof(p4)=8。由于p4作为一个字符数组,并不以''结尾, 所以strlen(p4)在计算字符串长度的时候,找不到结束符'',会发生字符串溢出。 

    所以,最后答案为:
    sizeof(p1)=4 
    sizeof(p2)=9 
    sizeof(p3)=1024 
    sizeof(p4)=8
    strlen(p1)=8
    strlen(p2)=8 
    strlen(p3)=8 
    strlen(p4)=字符串溢出,值不确定,甚至会引起程序崩溃

  • 相关阅读:
    最近发现一个网站
    2017-0206 委托封装的方法的参数类型
    迈向Angular 2
    趣学CCNA 路由与交换
    HCNA 2017年01月26日
    在linux中使用phpize安装php扩展模块
    接口和抽象类
    C:Program Files (x86)MSBuildMicrosoft.Cppv4.0V110Microsoft.CppCommon.targets(611,5): error MSB
    抽象类和抽象方法
    java数组与内存控制
  • 原文地址:https://www.cnblogs.com/fengxing999/p/11150902.html
Copyright © 2011-2022 走看看