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',这个时候就只能自己
主动去填加咯。