zoukankan      html  css  js  c++  java
  • 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',这个时候就只能自己

    主动去填加咯。 

  • 相关阅读:
    QT::目录/文件
    QT::标题栏/目录/托盘/工具条/状态栏
    QT::布局
    PHP 发送http请求
    php 图片缩放然后合成并保存
    PHP 打开已有图片进行编辑
    一些实用的方法整理(与语言无关)
    PHP 与pdf文档 与条码
    Excel导入遇到的问题An object with the same key already exists in the ObjectStateManager……
    【随笔】Apache降权和禁用PHP危险函数
  • 原文地址:https://www.cnblogs.com/DswCnblog/p/2875777.html
Copyright © 2011-2022 走看看