C++中有一个和c一样的类string
这个类非常奇怪,首先说明我疑惑的地方
string sz = "hello\0world";
string ch;
printf("%d,%d,%d,%d,%d,%d,%d",sz.size(),sz.capacity(),sizeof(sz),sizeof(string),ch.size(),ch.capacity(),sizeof(ch));
猜猜输出是什么?(在vs2010编译环境下)
程序输出结果是5,15,32,32,0,15,32.
这里我的理解是成员函数size()表示对象实际含有的元素数,而成员变量表示初始分配给对象所能容纳的最大元素数。那么sizeof表示对象占用空间大小。并且在string类中\0具有截断功能,使得size()不再查看后面的内容。当实际含有的元素数超过初始分配的最大容量时,那么系统将会再给对象分配16个字节。例如:
string ch;
string sz ="helloahaaaahhhaaaaaaaaaaaaaaaaaaaaaaa";
char *p = (char *)&sz;
printf("%d,%d,%d,%d,%d,%d,%d\r\n",sizeof(ch),ch.size(),ch.capacity(),sizeof(sz),sz.size(),sz.capacity(),sizeof(string));
printf("%s\r\n",sz);
printf("%s\r\n",p+6);
输出结果是 32,0,15,37,47,32。上述后两个printf输出为乱码。这个47是怎么得来的呢?首先为sz分配了15个内存空间,但是发现内存不足(实际有37个元素大于15)于是系统又分配了16个对象,但是37>(15+16)于是系统又分配了16个字节的内存空间,这样就得到了15+16+16=47。
为什么后两个printf会失败呢?
首先如果sz中含有的元素个数小于或等于15就能正确打印出来,一旦大于这个数将会打印出乱码。
但是p必须要偏移4个字节才能打印出对应的内容。string类中前4个字节到底是什么东西呢
通过调试发现存储着【D8】【4f】【7f】【00】这几个内容,但是这既不是容量大小0xF(15)也不是元素个数15的大小。到底是个什么东西呢?
查看内存中是个dc数值,用ASCII吗表示是个?号。好奇怪的东西。string类前几个到底是啥呢?