现在的位置: 首页 > 综合 > 正文

sizeof操作符各类笔试题型汇总

2017年08月07日 ⁄ 综合 ⁄ 共 1711字 ⁄ 字号 评论关闭

说明:以下例题结果均是在32位平台VC6.0环境得到的。

一、sizeof应用于基本数据类型

1、sizeof应用于指针

char *str = "0123456789";
char *str = (char *)malloc(100);
void *str = (void *)malloc(100);

解析:sizeof(str) = 4。32位CPU指针占4个字节。

2、sizeof应用于数组

char ss1[] = "0123456789";
char ss2[100] = "0123456789";
char q[] = "a\n"; 
int ss3[100];  
int *p = ss3;  

解析:

(1)sizeof(ss1) = 11,即sizeof(ss1) = 11 * sizeof(char) = 11,注意字符数组编译器自动在末尾填充“\0”。

(2)sizeof(ss2) = 100。

(3)sizeof(q) = 3。

(4)sizeof(ss3) = 400,即sizeof(ss3) = 100 * sizeof(int)= 400。

(5)sizeof(ss3) /sizeof(*ss3) = 100,实际上*ss3为数组中第一个元素占用的内存,为4个字节。

(6)sizeof(p) / sizeof(*p) = 1。指针p占用的内存显然为4个字节,而*p为数组中第一个元素同样占用4个字节。

二、sizeof应用于复合数据类型

1、结构中有普通成员和位域成员。例如:

struct DateTime_1
{
	unsigned int year;
	unsigned int month	: 4;
	unsigned int day	: 5;
	unsigned int hour	: 5;
	unsigned int minute	: 6;
	unsigned int second : 6;
};

解析:sizeof(DateTime_1) =8。因为sizeof(unsigned int) = 4,所以结构以4个字节对齐,位域成员占26个bit,将填充为4个字节。

2、结构中有长度为0的位域成员。例如:

struct DateTime_2
{
	unsigned int day	: 5;
	unsigned int		: 0;
	unsigned int minute	: 5;
};

解析:sizeof(DateTime_2) =8。长度为0的位域成员的作用是:使下一个成员从下一个完整的机器字开始分配空间。结构以4个字节对齐,day的位置是第一个4个字节的前5个bit,minute的位置是第二个4个字节的前5个bit。

3、结构中嵌套数组。例如:

struct X
{
	bool m_ch;
	double m_width;
	char m_name[10];
};

解析:sizeof(X) = 32。因为sizeof(double) = 8,所以结构以8个字节对齐,结构中的数组成员在内存中仍然连续存放。

4、结构中嵌套结构。例如:

struct X
{
	bool m_ch;
	double m_width;
	char m_name[10];
};
struct Y
{
	int m_no;
	struct X m_y;
};

解析:sizeof(Y) = 40。因为X是以8字节对齐的结构,sizeof(int) = 4,所以结构Y以8字节对齐。

5、结构中嵌套枚举。例如:

enum Color{RED = 0X01, BLUE, GREEN, YELLOW, BLACK};
struct sedan
{
	bool x1;
	Color x2;
	bool x3;
	double x4;
	unsigned int x5;
};

解析:sizeof(sedan) = 32。在标准C中,枚举类型的内存大小等于sizeof(int)。结构是以8个字节对齐的。

6、结构中嵌套联合。例如:

union R
{
	int x;
	char y[10];
	double z;
};
struct D
{
	bool m_ch;
	double m_width;
	char m_name[10];
	R r;
};

解析:sizeof(D) = 48。联合R以8字节对齐,最长的是数组y,所以sizeof(R) = 16。结构D以8字节对齐。

7、结构中有静态变量。例如:

class C  
{  
private:  
    int a;  
    static int b;  
	
    C();  
    ~C();  
};  

解析:sizeof(C) = 4。注意静态变量是存放在全局数据区的,而sizeof计算栈中分配的大小。

抱歉!评论已关闭.