• sizeof()以及strlen的一些考量


    sizeof(object) 大家都知道 得到object的长度以字节为单位。

    那么我们这样做几个实验:

      char info[]="hello";

      char *p=info;

      sizeof(info);

      sizeof(p);

    这些简单的当然很多人都知道,第一个返回的是6 第二个返回的是char* 类型在机器上的字节数(在我的64windows版本上这个值是4);

    然后有意思的事情就发生了:

          char info[]="hello" 这句话,十分的熟悉吧。其等价于 char info[5]="hello" 吗? 

     是不是有点疑惑,其实在编译阶段 char info[5]="hello" 就无法通过。是不是有点诡异,为什么呢 按照我们自己的设想

    info[0~4] 完全可以装下“hello” ,那为什么会提示:

    Error 1 error C2117: 'info' : array bounds overflow E:\vs2010project\01\01\01.cpp 16

    这里涉及到一个问题,windows下(linux本人不熟,不敢妄言)字符串的是以‘\0‘结尾的,那么在编译在静态栈上生气申请区域的时候,windows是强制

    给字符串类型加上‘\0‘,这样以来在申请字符串存储空间的时候,往往要多申请一个。所以我们经常会看到一下的代码:

    #define max 65536

    char buffer[max+1];

    是小小的问题,但是却值得注意,往往越界就经常这样在不明白的时候发生。

    同时 我们也会想到这样一个问题 既然char info[5]=“hello“编译不过,那我们换成 char info[6]="hello"吧。这样总是可以的吧。但是我们有没想过

    在我们经常教导着不能访问的char[5]上到底存在着什么? 试试就知道了:

    for(int i=0;i<6;i++)

    {printf(“%c “,info[i]);}

    结果如下:

    h e l l o 

    在o后面其实输出了一个空字符 '\0'

    不相信,那我们这样试下 info[5]='c,这句本身在教科书上是说不让访问的,这里我们强制j将'\0'给拿掉

    然后在这样

      pritf("%s",info)

    结果:

     hello****  *代表了一对不可预测的字符。说明了info[5]='\0' 是对的。。。

    这里可以做一个标记,在我们申请静态字符串的空间时候,系统会自动在后面添加'\0';

    而对于使用malloc 和new 等动态申请的字符串,系统是不会在你的字符串最后添加'\0',这个时候就只能自己

    主动去填加咯。 

  • 相关阅读:
    idea设置全局ignore
    win 2012 安装mysql 5.7.20 及报错 This application requires Visual Studio 2013 Redistributable. Please ins
    win 2012 安装mysql 5.7.20 及报错 This application requires Visual Studio 2013 Redistr
    kafka 删除 topic
    java编译中出现了Exception in thread “main" java.lang.UnsupportedClassVersionError
    Centos中使用yum安装java时,没有jps的问题的解决
    Spring 整合Junit
    Spring纯注解配置
    Spring 基于注解的 IOC 配置
    打印java系统的信息
  • 原文地址:https://www.cnblogs.com/DswCnblog/p/2875777.html
Copyright © 2020-2023  润新知