首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C++字符串sizeof有关问题

2013-01-23 
C++字符串sizeof问题如注释所问,有疑惑,请大家讨论讨论#include iostreamusing namespace stdint main(

C++字符串sizeof问题
如注释所问,有疑惑,请大家讨论讨论


#include <iostream>

using namespace std;
int main(int argc, char *argv[])
{
    //下面分配的二维字符数组,第二维大小是16
    char NTPsever[][16] = {
    "123456", 
    "12"};
    cout<<sizeof(NTPsever)<<endl;//32,为什么是32? 
    cout<<sizeof(NTPsever[0])<<endl;//16,是分配的大小吧? 
cout<<sizeof(NTPsever[1])<<endl;//16

    string str[2] = {
    "1234567890", 
    "12"};
    cout<<sizeof(str)<<endl;//8,为什么是8? 
    cout<<sizeof(str[0])<<endl;//4,为什么是4?难道是指针? 
cout<<sizeof(str[1])<<endl;//4

return 0;
}

[解决办法]
数组有32个字节 自然sizeof得到32

string类的大小和实现有关 你这里 一个string对象的大小是4 
这个对象的大小和他存储什么样的字符没关系的
[解决办法]
sizeof(string)在不同编译器下值不一样,这跟编译器对class string的实现方式有关。
不管什么平台,都是指string类型分配的空间(里面可能含有多个指针成员)。
我这边sizeof(str)是64,2个string,1个是32.
[解决办法]
    //下面分配的二维字符数组,第二维大小是16
    char NTPsever[][16] = {
    "123456", 
    "12"};
你这是开辟了一个二维数组,第一行靠前放置了字符串"123456"后面的用空字符''填充,第二行同理。
数组名关联一块内存空间,当你对数组名使用sizeof时会返回这个数组的大小的,sizeof返回的是字节数,你的char类型就是每个字符占一个字节嘛,所以sizeof返回的就是数组的大小,如果你数组中是整型的话那就是32*4字节了。
    cout<<sizeof(NTPsever)<<endl;//32,为什么是32? 
    cout<<sizeof(NTPsever[0])<<endl;//16,是分配的大小吧?
二维数组其实可以理解为一位数组,然后这个一位数组的每一个元素又是一个数组类型的。其实这样子理解更好解释数组与指针的一些关系,我是这么觉得的。NTPserver[0]是二维数组的第一个元素,同时他也是一个数组长度为二维数组的列数。
    cout<<sizeof(NTPsever[1])<<endl;//16

[解决办法]
sizeof函数是静态的,在编译的时候就能确定其返回值.也就是数据的占的内存字节数..其计算结果只看其 参数的数据类型..

对于基本数据类型,就是所占字节数 .
对于数组名,算的就是整个数组字节数..
对于类和对象, 只看类的成员变量的大小,有多个变量需要考虑内存对齐的影响。   有例外如果无成员变量为1.

因此char NTPsever[][16] :  ,整个数组32字节,一维数组为16字节。
string str[2] : string类只有一个成员变量,为char*的指针,因此每一个string对象sizeof都是4字节, 那么这里的数组自然就是8字节。
[解决办法]
同意楼上。。。。

热点排行
Bad Request.