sizeof-获取某个数据类型所占用空间的字节数
sizeof操作符的结果类型是size_t,是C的一种单目操作符,类似++,–等,并不是函数。
sizeof可以用于数据类型、变量:如sizeof(int),sizeof (var_name)
sizeof的结果(常用)
-
若操作数具有类型char、unsigned char或signed char,其结果等于1
-
int、unsigned int 、short int、unsigned short 、long int 、unsigned long 、float、double、long double类型的sizeof 在ANSI C中没有具体规定,大小依赖于实现,一般可能分别为2、2、2、2、4、4、4、8、10。
int | unsigned int | short int | unsigned short | long int | unsigned long | float | double | long double |
---|---|---|---|---|---|---|---|---|
2 | 2 | 2 | 2 | 4 | 4 | 4 | 8 | 10 |
- 当操作数是指针时,sizeof依赖于编译器。例如Microsoft C/C++7.0中,near类指针字节数为2,far、huge类指针字节数为4。一般Unix的指针字节数为4。
- 当操作数具有数组类型时,其结果是数组的总字节数。
- 联合类型操作数的sizeof是其最大字节成员的字节数。结构类型操作数的sizeof是这种类型对象的总字节数,包括任何垫补在内。
比如我的机器上,以下代码输出为16:
int main()
{
typedef struct a
{
char b;
double x;
}a;
printf("%d\n",sizeof(a));
return 0;
}
以下代码输出为8:
int main()
{
typedef union a
{
char b;
double x;
}a;
printf("%d\n",sizeof(a));
return 0;
}
sizeof的主要用途
- sizeof操作符的一个主要用途是与存储分配和I/O系统那样的例程进行通信。例如
void *malloc(size_t size),
size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream)。
- sizeof的另一个的主要用途是计算数组中元素的个数。例如:
void * memset(void * s,int c,sizeof(s))
易错
分析以下程序执行结果:
#include <iostream>
using namespace std;
void main()
{
double a[4]={0};
double *b=new double[4];
cout << "sizeof(a)=" << sizeof(a) << endl;
cout << "sizeof(a)/sizeof(a[0])=" << sizeof(a) / sizeof(a[0]) << endl;
cout << "sizeof(b)=" << sizeof(b) << endl;
cout << "sizeof(*b)=" << sizeof(*b) << endl;
delete [] b;
}
很容易认为:
(1)中sizeof(a)计算的是地址值所占的字节数,但是这里是个特例:
(4)中
都说数组和指针具有等价性:
[] = malloc(new) + *
但实质上还是略有一点不同的.C/C++明确知道整个数组占内存的大小(在声明的时候[]中的参数算是数组类型的一部分),却不知道指针所指向的,用malloc(new)申请的整块内存的大小.所以sizeof(*b)得到的只会是一个double型的内存块的大小,却不是b所指向的整个内存块的大小.
sizeof(数组名)是取整个数组字节数
siezeof(a)/sizeof(a[0]) = 4// 用整个数组占内存的大小 除以 每个元素占内存的大小 便得到数组的元素个数
sizeof(b)=8 // 这个是指针类型的大小 指针都是8
sizeof(*b)=8 // 这个是指针所指向的一个double型的内存块的大小
存入读出-底层ascll码和输入输出格式关系
int main()
{
int i = 33;
/*
(gdb) p/x i
$1 = 0x21
*/
char c = '!';
/*
(gdb) p/x c
$1 = 0x21
*/
printf("%d\n", i);// 33
printf("%c\n", i);// !
return 0;
}