sizeof例子

关于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求的是数据类型在内存中需要占有的内存大小(单位为字节),需要注意的几点如下

  1. 基本数据类型大小要记住;
  2. 要知道sizeof的求值对象,是一个普通变量还是指针,或者是数组;
  3. 对于指针而言,大小即为指针大小,不管是什么指针;
  4. 对于数组而言,sizeof的结果就是数组的大小;
  5. 对于求字符串的长度要注意转义字符,清楚什么时候是转义字符的结束;
  6. 求结构体(类)大小的时候要注意1)考虑对齐 2)对齐方式是以结构体最大的数据类型对齐的 3)每一种数据类型的地址都可以被其数据类型的大小整除;
  7. c和c++的sizeof('0')的结果是不一样的,c中会把'0'当成ini类型,而c++中则会把'0'当作char类型,所以才会有差异。
相信要是掌握了上述的几点,那么对于sizeof的求值问题,应该就不是问题了。


原文地址:https://www.cnblogs.com/arbboter/p/4225222.html