C/C++中的sizeof分析
来源:互联网 发布:推广淘宝产品 编辑:程序博客网 时间:2024/05/18 02:45
sizeof是C语言中的一种单目操作符,它并不是函数。它以字节形式给出了其操作数的存储大小。不同的操作系统和编译器可能会有不同的结果。下面的测试结果是在Win10 TDM-GCC 4.8.164-bit Release获取的。
1.2 使用方法
1.2.1 用于基本数据类型
使用形式: Sizeof(type)
Sizeof(int) //4
Sizeof(float) //4
Sizeof(double) //8
1.2.2 用于变量
使用形式: Sizeof(var_name)
注意:sizeof操作符不能用于函数类型、不完全类型指具有未知存储大小的数据类型、如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。
例如:sizeof(max) --若此时变量max定义为int max();
sizeof(char_v) --若此时char_v定义为char char_v[MAX]且MAX未知,
sizeof(void)
以上都是不正确形式。
1.3 样例测试结果
1.3.1 ANSI C正式规定字符类型为1字节
printf("%d\n",sizeof(char)); //1
printf("%d\n",sizeof(unsignedchar)); //1
printf("%d\n",sizeof(signedchar)); //1
1.3.2 其他类型在ANSI C中没有具体规定,大小依赖于平台
printf("%d\n",sizeof(int)); //4
printf("%d\n",sizeof(unsigned int)); //4
printf("%d\n",sizeof(short int)); //2
printf("%d\n",sizeof(unsigned short)); //2
printf("%d\n",sizeof(long int)); //4
printf("%d\n",sizeof(unsigned long)); //4
printf("%d\n",sizeof(float)); //4
printf("%d\n",sizeof(double)); //8
printf("%d\n",sizeof(long double)); //16
1.3.3 当操作数是指针时,sizeof依赖于编译器
Microsoft C/C++7.0中,near类指针字节数为2,far、huge类指针字节数为4。
一般Unix/Linux的指针字节数为4。
例如: char*p;
printf("%d\n",sizeof(p)); //8
1.3.4 当操作数具有数组类型时,其结果是数组的总字节数
chara[5];
intb[5];
printf("%d\n",sizeof(a)); //5
printf("%d\n",sizeof(b)); //20
1.3.5 当操作数是具体的字符串或者数组时,会根据具体的类型进行相应转化
printf("%d\n",sizeof(8)); //4
printf("%d\n",sizeof(8.1)); //8 默认是double类型
printf("%d\n",sizeof("ab")); //3
第三个样例会将字符串自动转化为数组类型,因为在最后加上了’\n’符
1.3.6 当操作数是联合类型或结构体类型
当操作数是联合类型时,sizeof是其最大字节成员的字节数。
当操作数是结构类型时,sizeof是其成员类型的总字节数,包括补充字节在内。
union u {
charc;
doubled;
}u;
struct s{
charc;
doubled;
}s;
printf("%d\n",sizeof(u)); //8
printf("%d\n",sizeof(s)); //16
对于样例二,一般而言sizeof(char) + sizeof(double) = 9;
这是因为编译器在考虑对齐问题时,在结构中插入空位以控制各成员对象的地址对齐。
但如果全对齐的话,sizeof(a) =16, 这是因为b被放到偏移量为0的地址,占1个字节;
在存放x时,double类型长度为8,需要放到能被8整除的偏移量上,这时候需要补7个空字节,
达到8个,这时候偏移量为8,放上x后长度为16。
在此例中,所有的结构成员都要放在被8整除的地址,这里补7个字节,所以为16。
1.3.7 当操作数是函数中的数组形参或函数类型的形参
sizeof给出其指针的大小,我的平台上值为8。
void fun(char aa[1000]){
printf("%d\n",sizeof(aa)); // 8
}
char *p;
fun(p);
1.3.8 其他的一些细节样例
chararr1[] ={'h','e','l','l','o'};
chararr2[] ="hello";
printf("%d\n",sizeof(arr1)); // 5
printf("%d\n",sizeof(arr2)); // 6 会加上’\n’结束
chararr3[20] = "hello";
chararr4[] = "hello";
printf("%d\n",sizeof(arr3)); // 20
printf("%d\n",sizeof(arr4)); // 6
- C/C++中的sizeof分析
- C语言中的sizeof
- C语言中的sizeof
- c语言中的sizeof()
- C语言中的sizeof
- C语言中的sizeof
- C/C++中的sizeof
- C语言中的sizeof()
- 解析C语言中的sizeof
- 解析C语言中的sizeof
- 解析C语言中的sizeof
- 解析C语言中的sizeof
- 解析C语言中的sizeof
- 解析C语言中的sizeof
- 解析C语言中的sizeof
- 解析C语言中的sizeof
- 解析C语言中的sizeof
- 解析C语言中的sizeof
- 实现div水平、垂直居中的几种方法
- RabbitMQ四种Exchange类型之Fanout (Erlang)
- 如何准备公共演讲,乔布斯给你几个建议.
- js手写,全屏轮播(支持左右切换)
- 原码, 反码, 补码 详解
- C/C++中的sizeof分析
- VS出现了莫名奇妙的字体
- Ubuntu中使用apt-get安装LAMP
- 算法 迷宫问题
- Ubuntu 16.04 apt-get搭建LAMP环境
- redis知识点--不断总结
- 将截断字符串或二进制数据
- C++如何获取类成员的偏移
- Windows 下 Nginx+IIS 使用