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

说明:以下例题结果均是在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计算栈中分配的大小。

时间: 2024-08-24 12:55:15

sizeof操作符各类笔试题型汇总的相关文章

C++ sizeof操作符的用法和strlen函数的区别

摘要:本人首先介绍了C++中sizeof操作符的用法和注意事项,其次对比了和strlen的区别和使用,方便大家在写代码的时候查阅,和面试.笔试的时候复习. 目录: sizeof的用法: sizeof和strlen的区别: sizeof的用法: sizeof 是一种单目操作符,而不是函数.sizeof以字节形式给出操作数的存储空间. 操作数可以是一个表达式或在括号内的类型名.操作数的存储空间由操作数的类型决定. char str[]="hello"; char str1[100]; ch

字符串 前篇 ---- sizeof()操作符和strlen()库函数

本文不是研究sizeof(), strlen() 的深奥定义和原理,我们不会在理论上太过钻牛角尖.希望读这篇文章的你,也不要太过抠概念(不要拘泥于语法).我们只做 实用意义 的介绍和讨论. 在介绍字符串之前,先介绍 sizeof()操作符 . strlen()库函数. 1.sizeof() 基本介绍 1 printf("int: %d\n", sizeof(int)); 2 printf("char: %d\n", sizeof(char)); 3 printf(&

C++中sizeof操作符与strlen函数

sizeof操作符: sizeof是一个操作符,返回一条表达式或一个类型名字所占的字节数.返回值一个常量表达式,类型为size_t. size_t sizeof(type) size_t sizeof expr 在sizeof的运算对象中解引用一个无效指针仍然是一种安全的行为,因为指针实际上并没有被真正使用,sizeof并不需要真的解引用指针也能知道它所指对象的类型. sizeof对C++的所有内置类型求其所占空间的大小: 环境:win7 64-bits, Code::Blocks 16.01,

【C++ Primer每日一刷之十二】 箭头操作符,条件操作符,sizeof操作符,逗号,优先级

5.6. 箭头操作符 C++ 语言为包含点操作符和解引用操作符的表达式提供了一个同义词:箭头操作符(->).点操作符(第 1.5.2 节)用于获取类类型对象的成员: item1.same_isbn(item2); // run thesame_isbn member of item1 如果有一个指向 Sales_item 对象的指针(或迭代器),则在使用点操作符 前,需对该指针(或迭代器)进行解引用: Sales_item *sp = &item1; (*sp).same_isbn(item

sizeof操作符-结构体与类大小

导读 sizeof是C/C++一个难点,当在自定义类上应用sizeof操作符时,总会出现意想不到的结果,下面,我们就来探讨一下sizeof这个操作符! 目录 1. sizeof与strlen的区别 2. sizeof作用于结构体 3. 字节对齐问题 4. sizeof作用于类 正文 1. sizeof与strlen的区别 这是老生常谈的问题了,下面举一个例子大家就明白了. char buf[] = "hello world!"; cout<<sizeof(buf)<&

数组名取地址以及数组名作为sizeof操作符的操作数

数组名取地址十分好玩,在这里记录一下,如果大家有不同见解,欢迎留言探讨: 在大多数情况下,数组名都会默认转换为指向数组的第一个元素的指针.这一点相信大家都知道.比如下边的例子:   int array[3] = {1,2,3};      cout << *array << endl;      cout << array[0] << endl; 上边的两个输出的值是相同的,这个时候array作为数组名默认转换为指向数组的第一个元素的指针.对数组名称进行解引

浅析C++中sizeof操作符的用法

1. 概要 sizeof是C/C++中的一个操作符(operator),作用就是返回一个对象或者类型所占的内存字节数.返回值类型为size_t,在头文件stddef.h中定义. 这是一个依赖于编译系统的值,一般定义为typedef unsigned int size_t;编译器林林总总,但作为一个规范,都会保证char.signed char和unsigned char的sizeof值为1,毕竟char是编程能用的最小数据类型. MSDN上的解释为: The sizeof keyword giv

js坑爹笔试题目汇总(持续更新中)

把你的面试官问倒,你就是一个合格的面试者了,下面总结一些易错的js笔试题目,会持续更新中,欢迎关注 1,考察this var length = 10 function fn(){ alert(this.length) } var obj = { length: 5, method: function(fn) { fn() // ? arguments[0]() // ? } } obj.method(fn) 这里的坑主要是arguments,我们知道取对象属于除了点操作符还可以用中括号,这里fn

笔试题目汇总

雅虎2015校招笔试 一.已知数组A[],实现数组B[];使得B[i]=A[0]*A[1]...*A[i-1]*A[i+1]...*A[n-1]要求:1)不能使用除法2)时间复杂度为O(n)3)空间复杂度为O(1) package com.bobo.interview; public class Yahoo1 { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method