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字节。
[解决办法]同意楼上。。。。