今天看了一篇文章叫《C/C++刁钻问题各个击破之细说sizeof》,然后自己想写一写。
sizeof的作用:
1.求基本类型和复合类型所占的内存字节数
如:sizeof(int)、sizeof(int *)
2.求某个变量或者常量所占的内存字节数
如:int i;
sizeof(i)
sizeof(5)
sizeof(5L)
3.求表达式所占的内存字节数,但是不执行括号里面的表达式
如:size(i++), i的值不变
4.求静态数组所占的内存字节数,这里的数组不能是指针,就是说所定义的数组和所用的sizeof的地方是同一个函数
如:int a[10]
5.求函数返回值类型所占字节数,但是不调用函数
误区:
1.sizeof是运算符不是函数
2.用sizeof求到的是一个unsigned int 的值
3.当数组是指针的时候求到的是指针所占的内存字节数
4.不可以求void类型所占内存字节数,可以求void类型指针所占内存字节数
sizeof(void)不可以
sizeof(void *)可以
下面是举例:
1.求基本类型和复合类型所占的内存字节数
<span style="font-size:18px;">#include<stdio.h>
int main()
{
long long i;
printf("sizeof(long long)=%u,sizeof(i)=%u,sizeof(1LL)=%u\n",sizeof(long long),sizeof(i),sizeof(1LL));
return 0;
}
</span>
<span style="font-size:18px;">#include<stdio.h>
struct size
{
int a;
int b;
double c;
};
int main()
{
struct size a;
printf("sizeof(struct size)=%u,sizeof(a)=%u\n",sizeof(struct size),sizeof(a));
return 0;
}</span>
2.求数组所占字节数,但不能求动态数组和传指针的数组
<span style="font-size:18px;">#include<stdio.h>
int main()
{
void f(int a[]);
int a[10];
printf("sizeof(a[10])=%u\n",sizeof(a));
f(a);
return 0;
}
void f(int a[])
{
printf("sizeof(a[])=%u\n",sizeof(a));
}
</span>
3.只求表达式类型,不求值
<span style="font-size:18px;">#include<stdio.h>
int main()
{
int i = 1;
int n = sizeof(++i);
printf("i = %d\n",i);
return 0;
}</span>
4.求函数返回类型所占内存数,不调用函数
#include<stdio.h>
int main()
{
int f();
printf("sizeof(f())=%u\n",sizeof(f()));
return 0;
}
int f()
{
printf("hello sizeof\n");
return 1;
}