关于sizeof,我首先想说的是它是一个宏,不是一个函数,其次sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型,该类型保证能容纳实现所建立的最大对象的字节大小,sizeof用来计算数据类型所占的内存大小。
先贴一些常见的sizeof求值对象:
// sizeof.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <stdio.h> #include <string.h> /* 整形结构体 */ struct TestShort { /* a占四个字节 */ int a; /* c占1一个字节 */ char c; /* short int 占2个字节 */ short int b; }; struct TestShort1 { /* c占1一个字节 */ char c; /* a占四个字节 */ int a; /* short int 占2个字节 */ short int b; }; struct Test { /* a占四个字节 */ int a; /* c占1一个字节 */ char c; }; /* 柔性结构体 */ struct TestSoft { /* a占四个字节 */ int a; /* c占1一个字节 */ char c; /* 定义了大小不确定的数组b,所以是柔性结构体 */ int b[]; }; /* long类型的结构体 */ struct TestDouble { /* a占八个个字节 */ double a; /* c占1一个字节 */ char c; }; int main(int argc, char *argv[]) { int data = 0; int *pInt = &data; int intArray[5] = {0}; int doubleIntArray[3][5]; char charArray[10]; char pStr[] = "hello,world"; char *pChar = "hello,world"; char pOx[] = "\023cd"; char pUnox[] = "\03834"; char pUnox1[] = "\0834"; /* int类型占4个字节,所以结果为4 */ printf( "sizeof(data) = %d\n", sizeof(data) ); /* int类型的指针,求的是指针所占的内存大小, 所以为一个int型数据大小即4 */ printf( "sizeof(pInt) = %d\n", sizeof(pInt) ); /* intArray为一个数组名,所以结果为数组的大小,即5*4=20 */ printf( "sizeof(intArray) = %d\n", sizeof(intArray) ); /* doubleIntArray为二维数组,结果为二维数组的大小即3*5*4=60 */ printf( "sizeof(doubleIntArray) = %d\n", sizeof(doubleIntArray) ); /* 字符数组,结果为数组大小即10*1=1 */ printf( "sizeof(charArray) = %d\n", sizeof(charArray) ); /* 通过赋值确定大小的字符数组,结果依然为数组大小即12*1=12 */ printf( "sizeof(pStr) = %d\n", sizeof(pStr) ); /* pChar为一个指向字符串的指针,所以结果为指针大小即4 */ printf( "sizeof(pChar) = %d\n", sizeof(pChar) ); /* pOx为含有转义字符的字符串,\023为一个字符,结果为数组大小即4*1=4 */ printf( "sizeof(pOx) = %d\n", sizeof(pOx) ); /* pUnox同pOx一样,第一个字符为\03,由于8不属于八进制,所以结果为5*1=5 */ printf( "sizeof(pUnox) = %d\n", sizeof(pUnox) ); /* pUnox1同pUnox,不过第一个字符为\0,所以结果为5*1=6 */ printf( "sizeof(pUnox1) = %d\n", sizeof(pUnox1) ); /* 由于第一个字符为\0,所以字符串长度为0,所以结果为0 */ printf( "strlen(pUnox1) = %d\n", strlen(pUnox1) ); /* double占八个字节 */ printf( "sizeof(double) = %d\n", sizeof(double) ); /* 结构体的大小要考虑按照结构体内最大数据类型大小对齐 */ /* 一个int占4个字节,一个char只需占一个字节就够了,但是要考虑 * 对齐,且本结构体内最大的数据类型为int型(占4个字节),而c结构 * 体内无其他数据了,所以char由于要对其,所以要给它分配四个字 * 节,所以结构体的大小为4+4=8 */ printf( "sizeof(struct Test) = %d\n", sizeof(struct Test) ); /* 同Test分析,但是由于后面的c和b加起来只需要分配3个字节,通过 * 对齐后,可以分配在一个四字节的内存内,所以结果还是8 */ printf( "sizeof(struct TestShort) = %d\n", sizeof(struct TestShort) ); /* 由于只需一个字节,而接下来的a占四个字节,由于每一种数据类型的地址都 * 要求能被数据类型大小整除,所以a需要占四个字节,所以结果为4+4+4=12 */ printf( "sizeof(struct TestShort1) = %d\n", sizeof(struct TestShort1) ); /* 由于结构体柔性结构体,最后面的数组不占内存所以结果和Test一样,即8 */ printf( "sizeof(struct TestSoft) = %d\n", sizeof(struct TestSoft) ); /* 此结构体的最大数据类型为8个字节的,所以本结构体的对齐是按照8字节对 * 齐的,所以本结构体的大小是8+8=16 */ printf( "sizeof(struct TestLong) = %d\n", sizeof(struct TestDouble) ); getchar(); return 0; }
运行结果为:
总结:sizeof求的是数据类型在内存中需要占有的内存大小(单位为字节),需要注意的几点如下
- 基本数据类型大小要记住;
- 要知道sizeof的求值对象,是一个普通变量还是指针,或者是数组;
- 对于指针而言,大小即为指针大小,不管是什么指针;
- 对于数组而言,sizeof的结果就是数组的大小;
- 对于求字符串的长度要注意转义字符,清楚什么时候是转义字符的结束;
- 求结构体(类)大小的时候要注意1)考虑对齐 2)对齐方式是以结构体最大的数据类型对齐的 3)每一种数据类型的地址都可以被其数据类型的大小整除;
- c和c++的sizeof('0')的结果是不一样的,c中会把'0'当成ini类型,而c++中则会把'0'当作char类型,所以才会有差异。
相信要是掌握了上述的几点,那么对于sizeof的求值问题,应该就不是问题了。