浅析sizeof函数
1.简介
sizeof函数是C语言中用于测试数据类型或数据对象所占内存字节数的一个功能函数,其原型为
int_t sizeof( Object) //Object为具体的变量对象
int_t sizeof Object //此时可省略括号
int_t sizeof(Type) //Type为基本数据类型,如int、char、array、struct、union......
说明:sizeof函数返回类型为int_t,为一个无符号长整型整数
2.功能
在Linux系统64位平台进行测试(1 byte =8 bit )
程序源码:
1 #include <stdio.h>
2
3 /* print the length of different types of data */
4 int main(int argc,char *argv[])
5 {
6 int i=10;
7 float f=2.0f;
8 double d=2.234;
9 char c='C';
10 int arrays[10];
11 struct s
12 {
13 char e;
14 int g;
15 }test;
16 union u
17 {
18 char ch;
19 int j;
20 double d;
21 }tu;
22 printf("Int %ld\n",sizeof(i));
23 printf("Float %ld\n",sizeof(f));
24 printf("Double %ld\n",sizeof(d));
25 printf("Int Arrays %ld\n",sizeof(arrays));
26 printf("Struct s %ld\n",sizeof(test));
27 printf("Union u %ld\n",sizeof(tu));
28 //test the errors
29 printf("double %ld\n",sizeof 2.33);
30 printf("int %ld\n",sizeof 66);
31
32 return 0;
33 }
测试效果:
重点关注
1.)数组:其内存所占字节长度为基本数据类型长度*数组长度,此处4x10
2.)指针:用于记录存放数据的地址,其长度等于计算机内部地址总线的宽度,所以在32位系统中,占32位4字节;在64位系统中,占64位8字节;其长度跟指针指向的类型无关!
3.)结构体struct s { char e;int g}test; //注意结果为8,并不是5
原因在于:计算机为加快读取速度,存在字节对齐问题;编译器会对结构体和其他类型数据进行处理,让宽度为2的数据类型位于能被2整除的地址上,宽度为4的基本数据类型位于能被4整除的地址上,以此类推;这样两个数中间就要加入字节,导致sizeof长度变长(这也是结构体数据连续存储的缘由导致的);结构体在内存组织上是顺序式的
4.)共同体union u{char h;int j;double d;}tu; //结果为8,不是13
原因在于:共同体的数据存储空间是重叠式的,其长度为共同体内部最长的数据类型的长度,此处为double型8字节