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',这个时候就只能自己

主动去填加咯。 

 

 

 

posted @ 2012-07-02 20:58  奔跑的兔子  阅读(756)  评论(0编辑  收藏  举报